自定義ImageView控制元件
阿新 • • 發佈:2019-01-05
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CircleImageView">
<attr name="src" format="reference"/>
</declare-styleable>
</resources>
class檔案
package com.zdsoft.circleimageview; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; /** * Created by Administrator on 2017/1/11. */ public class CircleImageView extends View { private int src; public CircleImageView(Context context) { super(context); } public CircleImageView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } /** * 接收屬性值 * * @param context * @param attrs */ private void init(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView); if (typedArray != null) { src = typedArray.getResourceId(R.styleable.CircleImageView_src, R.mipmap.ic_launcher); typedArray.recycle(); } } @Override protected void onDraw(Canvas canvas) { Bitmap sfBitmap = null;//縮放後的bitmap //1、獲取Bitmap Bitmap bitmap = BitmapFactory.decodeResource(getResources(), src); //2、裁剪:對原始bitmap進行處理,看是否需要進行縮放處理,如果bitmap寬度或高度只要不等於圓的直徑。 if (bitmap.getWidth() != getWidth() || bitmap.getHeight() != getWidth()) { sfBitmap = Bitmap.createScaledBitmap(bitmap, getWidth(), getWidth(), false); } else { sfBitmap = bitmap; } Bitmap output = Bitmap.createBitmap(sfBitmap.getWidth(), sfBitmap.getHeight(), Bitmap.Config.ARGB_8888); //3、例項化新的一張畫布Canvas Canvas canvas_new = new Canvas(output); //4、對畫布進行裁剪 Paint paint = new Paint(); paint.setAntiAlias(true);//抗鋸齒 paint.setFilterBitmap(true);//抗鋸齒,對點陣圖進行濾波處理 paint.setDither(true);//設定防抖動,影象比較柔和 canvas_new.drawCircle(sfBitmap.getWidth() / 2, sfBitmap.getWidth() / 2, sfBitmap.getWidth() / 2, paint); //5、核心部分,設定兩張圖片的相交模式,在這裡就是上面繪製的Circle和下面繪製的Bitmap Rect rect = new Rect(0, 0, sfBitmap.getWidth(), sfBitmap.getWidth()); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//取兩層繪製交集,顯示上層 canvas_new.drawBitmap(sfBitmap, rect, rect, paint); //6、把輸出bitmap放到輸出畫布上去 canvas.drawBitmap(output, 0, 0, null); } }
layout檔案
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <com.zdsoft.circleimageview.CircleImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="15dp" app:src="@drawable/a1" /> </RelativeLayout>