安卓自定義上面圓角下面直角的RoundCornerImageView
阿新 • • 發佈:2019-01-28
下面是RoundCornerImageView的程式碼:
下面是佈局程式碼:package com.example.roundcornerviewgroup; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; import android.util.AttributeSet; import android.widget.ImageView; /** * 主要有兩種方式實現,Xfermode方式和bitmapShader方式 * Xfermode * @author wbl * */ public class RoundCornerImageView extends ImageView{ private Paint mPaint; private Paint mPaint2; private int roundHeight = 20; private int roundWidth = 20; public RoundCornerImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public RoundCornerImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public RoundCornerImageView(Context context) { super(context); } private void init() { mPaint = new Paint(); mPaint.setColor(Color.WHITE); mPaint.setAntiAlias(true); //16種狀態 mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); mPaint2 = new Paint(); mPaint2.setXfermode(null); } @Override public void onDraw(Canvas canvas) { Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888); Canvas canvas2 = new Canvas(bitmap); super.onDraw(canvas2); drawLeftUp(canvas2); drawRightUp(canvas2); // drawLeftDown(canvas2); // drawRightDown(canvas2); canvas.drawBitmap(bitmap, 0, 0, mPaint2); bitmap.recycle(); } private void drawLeftUp(Canvas canvas) { Path path = new Path(); path.moveTo(0, roundHeight); path.lineTo(0, 0); path.lineTo(roundWidth, 0); //arcTo的第二個引數是以多少度為開始點,第三個引數-90度表示逆時針畫弧,正數表示順時針 path.arcTo(new RectF(0,0,roundWidth*2,roundHeight*2),-90,-90); path.close(); canvas.drawPath(path, mPaint); } private void drawLeftDown(Canvas canvas) { Path path = new Path(); path.moveTo(0, getHeight()-roundHeight); path.lineTo(0, getHeight()); path.lineTo(roundWidth, getHeight()); path.arcTo(new RectF(0,getHeight()-roundHeight*2,0+roundWidth*2,getHeight()),90,90); path.close(); canvas.drawPath(path, mPaint); } private void drawRightDown(Canvas canvas) { Path path = new Path(); path.moveTo(getWidth()-roundWidth, getHeight()); path.lineTo(getWidth(), getHeight()); path.lineTo(getWidth(), getHeight()-roundHeight); path.arcTo(new RectF(getWidth()-roundWidth*2,getHeight()-roundHeight*2,getWidth(),getHeight()), 0, 90); path.close(); canvas.drawPath(path, mPaint); } private void drawRightUp(Canvas canvas) { Path path = new Path(); path.moveTo(getWidth(), roundHeight); path.lineTo(getWidth(), 0); path.lineTo(getWidth()-roundWidth, 0); path.arcTo(new RectF(getWidth()-roundWidth*2,0,getWidth(),0+roundHeight*2),-90,90); path.close(); canvas.drawPath(path, mPaint); } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#50000000" android:gravity="center_horizontal" android:padding="10dp" tools:context=".MainActivity" > <LinearLayout android:layout_width="350dp" android:layout_height="wrap_content" android:orientation="vertical" > <com.example.roundcornerviewgroup.RoundCornerImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" android:src="@drawable/d" /> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:background="#fff" android:gravity="center" android:text="center" /> <View android:layout_width="match_parent" android:layout_height="0.2dp" /> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/bottom" android:gravity="center" android:text="Bottom" /> </LinearLayout> </RelativeLayout>
執行效果圖: