Android自定义控件-不同形状的ImageView
来源:互联网 发布:直接引用vue.js没反应 编辑:程序博客网 时间:2024/06/09 22:21
实现分析:
依然是用到Paint的图层混合模式,
1、画一个你想要的形状 || 图片
2、修改Paint的图层混合模式,画图片。
3、然后就能得到你想要的形状的ImageView
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));设置模式
这2种模式都可以很简单的实现
SRC_IN:在两者相交的地方绘制源图像,并且绘制的效果会受到目标图像透明度的影响;
DST_IN :在两者相交的地方绘制目标图像,并且绘制的效果会受到源图像透明度的影响;
主要代码:
package com.example.roundimageview;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.widget.ImageView;/* * 圆形ImageView的实现 * 1,先画一个圆 * 2.修改Paint的图层混合模式 * 3.最后在画Bitmap */public class MyImageView extends ImageView { public MyImageView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub //得到Drawable对象 Drawable drawable = getDrawable(); if (drawable == null) { return; } if (getWidth() == 0 || getHeight() == 0) { return; } // 得到图片 Bitmap b = ((BitmapDrawable) drawable).getBitmap(); if (b == null) { return; } Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true); int w = getWidth(), h = getHeight(); int diameter = w >= h ? h : w; Bitmap roundBitmap = getCroppedBitmap(bitmap, diameter); canvas.drawBitmap(roundBitmap, 0, 0, null); } /* * 获取圆形图片 1.需要图片 2.图片宽高 */ private Bitmap getCroppedBitmap(Bitmap bmp, int radius) { Bitmap sbmp; if (bmp.getWidth() != radius || bmp.getHeight() != radius) sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false); else sbmp = bmp; Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xffa19774; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight()); // 设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作 // paint.setFilterBitmap(true); // paint.setDither(true); canvas.drawARGB(0, 0, 0, 0); paint.setAntiAlias(true); paint.setColor(Color.WHITE); // 绘制目标图层 canvas.drawCircle(sbmp.getWidth() / 2, sbmp.getHeight() / 2, sbmp.getWidth() / 2 - 6f, paint); // 设置混合模式:在两者相交的地方绘制源图像 paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); // 绘制源图层 canvas.drawBitmap(sbmp, rect, rect, paint); // 绘制边框 drawCircleBorder(canvas, sbmp.getWidth() / 2 - 6f, color, sbmp.getWidth() / 2, sbmp.getHeight() / 2); return output; } // 外圆 private void drawCircleBorder(Canvas canvas, float radius, int color, float defaultWidth, float defaultHeight) { Paint paint = new Paint(); // 去锯齿 paint.setAntiAlias(true); // 外圆颜色 paint.setColor(Color.BLACK); // 设置paint的 style 为STROKE:空心 paint.setStyle(Paint.Style.STROKE); // 设置paint的宽度 paint.setStrokeWidth(6.0f); canvas.drawCircle(defaultWidth, defaultHeight, radius, paint); }}
源码下载
0 0
- Android自定义控件-不同形状的ImageView
- Android 自定义形状ImageView
- 自定义形状的ImageView
- CustomShapeImageView 自定义形状的ImageView
- 自定义形状的ImageView制作
- android自定义带倒影的ImageView控件
- Shape 自定义控件的形状
- android不同形状的头像
- Android - 实现各种形状的ImageView
- Android - 实现各种形状的ImageView
- 【组合控件】android自定义控件之带文字的ImageView
- android 自定义圆形imageview控件
- Android自定义控件(四) 自定义ImageView动态设置ImageView的高度
- 自定义类似ImageView的控件
- Android自定义控件——带阴影的ImageView(ShaderImageView)
- [Android自定义控件]带加载进度条的ImageView
- 创建自定义形状的窗体和控件
- 创建任何自定义形状的控件
- Vim多行缩进及高级命令
- Crunch 学习(一)
- h264 流、帧结构
- 选择排序
- django相关
- Android自定义控件-不同形状的ImageView
- Format(const wchar_t *,...)”: 不能将参数 1 从“const char [3]”转换为“const wchar_t *”.
- Android面试经验总结
- java LinkedList源码解读
- 仿美团实现城市定位。
- 如何在Visual Studio项目中正确添加汇编代码
- 网络设备入门测试
- 前端学习体系
- HDOJ1166(线段树,树状数组)