1. 程式人生 > 其它 >《Android》利用canvas的PorterDuffXfermode製作首次啟動引導頁面

《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裡新增這個guideView和自己想要的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頁面都有

測試效果: