一、Canvas和Paint基礎
Canvas和Paint是Android自定義View中最為基礎的兩個類。Canvas類表示一個繪圖面,可以在其上面執行各種繪製操作。Paint類則表示繪製的筆刷,可以設置其粗細、顏色、線條樣式等。因此,我們在自定義View時需要了解Canvas和Paint的基礎使用方法。
首先,在自定義View的onDraw()方法中創建一個Canvas對象,並用Paint對象設置繪圖選項。接着,通過Canvas的繪製方法繪製我們希望看到的圖形。最後,將繪製好的圖形顯示在屏幕上。
public class MyView extends View {
private Paint mPaint; // 畫筆
private Canvas mCanvas; // 畫布
public MyView(Context context) {
super(context);
mPaint = new Paint();
mCanvas = new Canvas();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.RED); // 設置畫筆顏色
mPaint.setStrokeWidth(5); // 設置畫筆寬度
// 在畫布上繪製圓形
mCanvas.drawCircle(100, 100, 50, mPaint);
// 將畫布顯示在屏幕上
canvas.drawBitmap(mCanvasBitmap, 0, 0, null);
}
}
二、自定義形狀繪製
在Android自定義View中,我們可以通過Canvas和Paint類實現各種自定義形狀的繪製。例如線條、矩形、圓形、橢圓以及各種不規則圖形等等。
下面以繪製一個扇形為例,展示具體的實現過程:
public class ArcView extends View {
private Paint mPaint; // 畫筆
private RectF mRectF; // 矩形
private int mWidth, mHeight; // 控件寬高
public ArcView(Context context) {
super(context);
mPaint = new Paint();
mRectF = new RectF();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
mRectF.set(0, 0, mWidth, mHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.RED); // 設置畫筆顏色
mPaint.setStyle(Paint.Style.FILL); // 設置畫筆樣式為實心
canvas.drawArc(mRectF, -45, 90, true, mPaint); // 繪製扇形
}
}
三、高級特效實現
使用Canvas和Paint結合其他的特效類庫,能夠產生一些非常精美的UI效果。例如水波紋效果、模糊效果、圓角矩形等等。
現在以繪製一個帶水波紋的圓形按鈕為例:
public class RippleButtonView extends View {
private Paint mPaint; // 畫筆
private Bitmap mBitmap; // Bitmap
private BitmapShader mBitmapShader; // BitmapShader
private int mRadius; // 圓的半徑
private Shader mShader; // 渲染器
private PorterDuffXfermode mPorterDuffXfermode; // 混合模式
public RippleButtonView(Context context) {
super(context);
mPaint = new Paint();
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setShader(mShader);
canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
mPaint.setShader(null);
mPaint.setXfermode(mPorterDuffXfermode);
canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
mPaint.setXfermode(null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
createShader();
break;
case MotionEvent.ACTION_UP:
mShader = null;
break;
}
return true;
}
private void createShader() {
mShader = new RadialGradient(mRadius, mRadius, mRadius,
new int[]{Color.TRANSPARENT, Color.parseColor("#66FFFFFF")},
null, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
invalidate();
}
}
以上是Android自定義View使用Canvas和Paint實現精美UI效果的核心內容,通過學習這些基礎並實踐,我們可以創造出更豐富獨特的自定義View。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/152545.html
微信掃一掃
支付寶掃一掃