Paint API之—— Xfermode与PorterDuff

作者: 侯蛋蛋_ | 来源:发表于2017-09-27 14:12 被阅读40次

    导航

    Android Paint之颜色过滤器

    Paint之shader(图像渲染)

    Paint之PathEffect(路径效果)

    Paint API之—— MaskFilter(面具)

    android之绘图工具类详解

    Paint API之—— Xfermode与PorterDuff全面详解

    Paint API之—— Xfermode与PorterDuff详解(三)动画效果

    Paint枚举、常量值、阴影效果、字体

    1.要实现的效果图以及实现流程分析:

    要实现的效果图

    实现流程分析

    Step 1.首先,一个文字图片(透明背景)

    Step 2.初始化画笔,背景图片(DST),矩形Rect(SRC)

    Step 3.先保存图层,接着先绘制背景图,设置混排模式,然后绘制Rect,清除混排模式 接着回复保存的图层,最后修改下Rect区域高度,调用invalidate()让View重绘!

    如果流程分析有点不懂,直接看代码,超简单~

    2.代码实现:

    首先是屏幕工具类,ScreenUtil.java,这里就不贴了,之前的几节中有贴过! 然后是我们的自定义View类:LoadTextView.java

    public class LoadTextView extends View {
    
        private PorterDuffXfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
        private Bitmap backBitmap;
        private Paint mPaint;
        private int mBitW, mBitH;
        private int mCurW, mCurH, mCurTop;
        private Rect mDynamicRect;
    
        public LoadTextView(Context context) {
            this(context, null);
        }
        public LoadTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            mCurW = ScreenUtil.getScreenW(context);
            mCurH = ScreenUtil.getScreenH(context);
            init();
        }
        public LoadTextView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
    
        private void init() {
            //画笔初始化:
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setFilterBitmap(true);
            mPaint.setDither(true);
            mPaint.setColor(Color.RED);
            //背部图片的初始化
            backBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.img_string);
            mBitH = backBitmap.getHeight();
            mBitW = backBitmap.getWidth();
            //设置当前的高度
            mCurTop = mBitH;
            mDynamicRect = new Rect(0, mBitH, mBitW, mBitH);  //初始化原图
        }
    
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            int saveLayerCount = canvas.saveLayer(0, 0, mCurW, mCurH, mPaint, Canvas.ALL_SAVE_FLAG);
            canvas.drawBitmap(backBitmap, 0, 0, mPaint);// 绘制目标图
            mPaint.setXfermode(mXfermode);    //设置混排模式
            canvas.drawRect(mDynamicRect, mPaint);   //绘制源图
            mPaint.setXfermode(null);         //清除混排模式
            canvas.restoreToCount(saveLayerCount);    //恢复保存的图层
            // 改变Rect区域,假如
            mCurTop -= 2;
            if (mCurTop <= 0) {
                mCurTop = mBitH;
            }
            mDynamicRect.top = mCurTop;
            invalidate();    //重绘
        }
    
    }
    

    就是这么简单

    相关文章

      网友评论

        本文标题:Paint API之—— Xfermode与PorterDuff

        本文链接:https://www.haomeiwen.com/subject/atoyextx.html