《Android》利用canvas的PorterDuffXfermode制作首次启动引导页面

原理:

  • 首先获取根布局的Fragment
  • 利用canvas和paint绘制一个透明背景
  • 使用CLEAR作为PorterDuffXfermode绘制需要高亮的地方
    然后在Fragment里addview自己需要的图片,例如箭头,文字说明等



    代码:这是蒙版代码,里面包括需要高亮的View

    class MyView extends View {
        private Paint mPaint;
        public MyView(Context context) {
            super(context);
            mPaint=new Paint();
        }

         @Override

         protected void onDraw(Canvas canvas) {
             super.onDraw(canvas);
             //设置背景色
             //canvas.drawColor(Color.parseColor("#88000000"));
             int canvasWidth = getWidth();
             int canvasHeight = getHeight();
             canvas.saveLayer(0, 0, canvasWidth, canvasHeight, null, Canvas.ALL_SAVE_FLAG);
             int r = canvasWidth / 3;
             //绘制透明背景蒙版
             mPaint.setColor(Color.parseColor("#88000000"));
             canvas.drawRect(0, 0,canvasWidth,canvasHeight, mPaint);
             //使用CLEAR作为PorterDuffXfermode绘制蓝色的矩形(mPaint颜色随意)
             mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
             mPaint.setColor(0xFF66AAFF);
             canvas.drawRect(getWidth() >> 1, r, r * 2.7f, r * 2.7f, mPaint);
             //最后将画笔去除Xfermode
             mPaint.setXfermode(null);


         }

注意:红色的代码是重点一定要写,不然无效

然后在根布局Fragment里添加这个myView和自己想要的View

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View view = getWindow().getDecorView().findViewById(R.id.activity_main);
if (view == null) {
            return;
        }
        ViewParent viewParent = view.getParent();
        if (viewParent instanceof FrameLayout) {
            FrameLayout frameParent = (FrameLayout) viewParent;//获取根布局的fragment
            //加载想要的布局
            View inflate = LayoutInflater.from(this).inflate(R.layout.itemone, null, false);
MyView m
=new MyView(this); m.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { frameParent.removeView(inflate); frameParent.removeView(m); } }); frameParent.addView(m); frameParent.addView(inflate); }
}

注意:这里的根布局的Fragment是DecorView下面的Fragment,每个Actvity页面都有

 

 测试效果:  

 

 

 

 

 

    
posted @ 2021-07-30 14:38  白晨里的影子  阅读(127)  评论(0)    收藏  举报