《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页面都有

测试效果:


浙公网安备 33010602011771号