《Android》利用canvas的PorterDuffXfermode製作首次啟動引導頁面
阿新 • • 發佈:2021-07-30
原理:
- 首先獲取根佈局的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頁面都有
測試效果: