v4 Simple下的XferMode学习.

来源:互联网 发布:淘宝细节描述文案 编辑:程序博客网 时间:2024/04/28 10:38

好久都没有更新博客,前段时间忙着调试某程序不可开交,通信协议搞定了,就空闲下来了,废话不多说哈.

XferMode不得不说这一应该算是相对目前比较主流简单的使用的方式了.可以实现圆角矩形,圆形等图片.所以还是把这个记录下来,代码要多写多练才行.

下面是V4 Demo下的原图:


/** * 根据原图和变长绘制圆形图片 *  * @param source * @param min * @return */private Bitmap createCircleImage(Bitmap source, int min){final Paint paint = new Paint();paint.setAntiAlias(true);Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);/** * 产生一个同样大小的画布 */Canvas canvas = new Canvas(target);/** * 首先绘制圆形 */canvas.drawCircle(min / 2, min / 2, min / 2, paint);/** * 使用SRC_IN */paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));/** * 绘制图片 */canvas.drawBitmap(source, 0, 0, paint);return target;}

其实主要靠:paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));这行代码,为什么呢,我给大家解释下,SRC_IN这种模式,两个绘制的效果叠加后取交集展现后图,怎么说呢,咱们第一个绘制的是个圆形,第二个绘制的是个Bitmap,于是交集为圆形,展现的是BItmap,就实现了圆形图片效果。圆角,其实就是先绘制圆角矩形,是不是很简单,以后别人再说实现圆角,你就把这一行代码给他就行了。

下面主要突出一下自定义View的时候需要注意OnMeasure方法,以前自定义都没注意这个方法,原来藏了很多东西,比如你的Padding,比如你的Mraggin等.都会影响.导致布局不能正常适配,适用性非常差,所以为了写优质的自定义的控件,查找一些资料书籍,比较好的模板代码:

/** * 计算控件的高度和宽度 */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){// super.onMeasure(widthMeasureSpec, heightMeasureSpec);/** * 设置宽度 */int specMode = MeasureSpec.getMode(widthMeasureSpec);int specSize = MeasureSpec.getSize(widthMeasureSpec);if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate{mWidth = specSize;} else{// 由图片决定的宽int desireByImg = getPaddingLeft() + getPaddingRight()+ mSrc.getWidth();if (specMode == MeasureSpec.AT_MOST)// wrap_content{mWidth = Math.min(desireByImg, specSize);} elsemWidth = desireByImg;}/*** * 设置高度 */specMode = MeasureSpec.getMode(heightMeasureSpec);specSize = MeasureSpec.getSize(heightMeasureSpec);if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate{mHeight = specSize;} else{int desire = getPaddingTop() + getPaddingBottom()+ mSrc.getHeight();if (specMode == MeasureSpec.AT_MOST)// wrap_content{mHeight = Math.min(desire, specSize);} elsemHeight = desire;}setMeasuredDimension(mWidth, mHeight);}


最后项目地址(带了一些5.x的效果):点击打开链接

0 0
原创粉丝点击