Android-只有2個圓角的ImageView
阿新 • • 發佈:2019-01-10
本例子是針對將圖片兩個直角轉換為圓角的例子:
1.自定義3個屬性 寬高,圓角值:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyPhotoView"> <attr name="width" format="dimension"></attr> <attr name="height" format="dimension"></attr> <attr name="radus" format="dimension"></attr> </declare-styleable> </resources>
2.在引用的佈局中使用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bc="http://schemas.android.com/apk/res/org.lean" android:layout_width="match_parent" android:layout_height="match_parent" > <org.lean.MyPhotoView android:id="@+id/photo_iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_marginLeft="60dp" bc:width="160dp" bc:height="240dp" bc:radus="10dp" /> </RelativeLayout>
3.在Java程式碼中設定兩個圖層。這裡有2個圖片 先繪製的叫目標圖層,然後設定混合渲染繪製 ,後繪製的圖層成為源圖層。
SRC_IN 模式在兩者相交的地方繪製源圖層(同時隱藏目標圖層),並且繪製的效果會受到目標影象對應地方透明度的影響;
package org.lean; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.widget.ImageView; /** * 重繪的ImageView * * @author Lean */ public class MyPhotoView extends ImageView{ private Bitmap mImageBtp; private Rect mImageSrcRect ,mImageDesRect; private Rect mBtmRect; private float mTotalWidth; private float mTotalHeight; private float mRadus; public MyPhotoView(Context context,int with,int height,float radus) { super(context); mTotalWidth=with; mTotalHeight=height; mRadus=radus; } public MyPhotoView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyPhotoView); mTotalWidth = array.getDimensionPixelSize(R.styleable.MyPhotoView_width, 0); mTotalHeight = array.getDimensionPixelSize(R.styleable.MyPhotoView_height, 0); mRadus = array.getDimensionPixelSize(R.styleable.MyPhotoView_radus, 0); array.recycle(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mImageDesRect=new Rect(0, 0,(int)mTotalWidth, (int)mTotalHeight); mBtmRect=new Rect(0, 0,(int)mTotalWidth,(int)(mTotalHeight+mRadus)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG); PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); canvas.drawColor(Color.WHITE); int saveCount=canvas.saveLayer(0,0, mTotalWidth,mTotalHeight,paint,Canvas.ALL_SAVE_FLAG); if (mImageBtp!=null) { paint.setColor(Color.WHITE); canvas.drawRoundRect(new RectF(mBtmRect), mRadus, mRadus, paint); paint.setXfermode(xfermode); canvas.drawBitmap(mImageBtp,mImageSrcRect,mImageDesRect,paint); paint.setXfermode(null); } canvas.restoreToCount(saveCount); } @Override public void setImageBitmap(Bitmap bm) { super.setImageBitmap(bm); mImageBtp=bm; reCalculateRect(); } private void reCalculateRect() { mImageSrcRect=new Rect(0, 0,mImageBtp.getWidth(),mImageBtp.getHeight()); invalidate(); } @Override public void setImageResource(int resId) { super.setImageResource(resId); mImageBtp=((BitmapDrawable)getResources().getDrawable(resId)).getBitmap(); reCalculateRect(); } }