使用BitmapShader在自定义View中画圆形
2015-09-21 14:24
344 查看
/** * 画个圆 * Created by cold on 15/9/21. */ public class BitShape extends View { private Bitmap bitmap; private Context context; private BitmapShader bitmapShader; //该view为50dp的圆 private int width=50; private int widthpx;//图片的宽度像素 private float mRadius;//圆半径 private Matrix mMatrix;//缩放矩阵 private Paint bitmapPaint;//画笔 //在构造方法中各种初始化 public BitShape(Context context) { super(context); this.context=context; //设置默认显示的图片 this.bitmap=getRes("default_pic"); bitmapPaint = new Paint(); bitmapPaint.setAntiAlias(true); mMatrix = new Matrix(); bitmapShader=new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); bitmapPaint.setShader(bitmapShader); } public BitShape(Context context, AttributeSet attrs) { super(context, attrs); this.context=context; this.bitmap=getRes("default_pic"); bitmapPaint = new Paint(); bitmapPaint.setAntiAlias(true); mMatrix = new Matrix(); bitmapShader=new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); bitmapPaint.setShader(bitmapShader); } //设置大小为50dp @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); widthpx=dp2px(width); mRadius=widthpx/2; setMeasuredDimension(widthpx,widthpx); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //先设置图片的缩放 float scale = 1.0f; // 拿到bitmap宽或高的小值 int bSize = Math.min(bitmap.getWidth(), bitmap.getHeight()); scale = widthpx * 1.0f / bSize; // shader的变换矩阵,我们这里主要用于放大或者缩小 mMatrix.setScale(scale, scale); // 设置变换矩阵 bitmapShader.setLocalMatrix(mMatrix); //调用.setShader方法 bitmapPaint.setShader(bitmapShader); //画圆 canvas.drawCircle(mRadius, mRadius, mRadius, bitmapPaint); } //改变要绘制的bitmap public void changeBitmap(Bitmap bitmap){ this.bitmap=bitmap; bitmapShader=new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); //通知重绘 postInvalidate(); } //获取Bitmap public Bitmap getRes(String name) { ApplicationInfo appInfo = context.getApplicationInfo(); int resID = getResources().getIdentifier(name, "drawable", appInfo.packageName); return BitmapFactory.decodeResource(getResources(), resID); } public int dp2px(int dpVal) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, getResources().getDisplayMetrics()); } }
相关文章推荐
- FAST角点检测:Features From Accelerated Segment Test
- 在mac下通过tcpdump抓iPhone包
- Linux 联网 安装 MySQL
- Web——KnockOut 监控属性
- 初步了解消息中间件
- 2015.09.21
- python例子-抓取网站IP列表
- Ubuntu默认root用户密码
- 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器
- 明德扬视频分享--点拨FPGA课程 100多个案例免费学
- PullToRefresh上拉刷新和下拉刷新
- 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器
- 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器
- jsoncpp 编译注意事项
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
- SpringMVC中使用Interceptor拦截器
- 欢迎使用CSDN-markdown编辑器
- Java序列化及serialVersionUID作用
- XMST2015下半年加班
- JavaEE问题之jdk问题