(一)
通过Xfermode方式,主要是把两张图片组合,由你决定是选取重叠部分还是非重叠部分,可以参考Android官方提供的图片

本文采用DstIn方式,首先画一个实心圆
//实心圆的宽高要与当前view的尺寸相同PRivate Bitmap getCircleBitmap() { if (mCircleBitmap == null) { mCircleBitmap = Bitmap.createBitmap(2 * mRadius, 2 * mRadius, Config.ARGB_8888); Canvas canvas = new Canvas(mCircleBitmap); mPaint.reset(); mPaint.setStyle(Style.FILL); canvas.drawCircle(mRadius, mRadius, mRadius, mPaint); } return mCircleBitmap; }然后将你画的圆盖到设置的图片上private Bitmap combineBitmap(Drawable drawable, Bitmap maskBitmap) { int mWidth = drawable.getIntrinsicWidth(); int mHeight = drawable.getIntrinsicHeight(); Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, 2 * mRadius, 2 * mRadius);//将图片放缩到view的尺寸 drawable.draw(canvas); mPaint.reset(); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));//设置DST_IN方式 canvas.drawBitmap(maskBitmap, 0, 0, mPaint); mPaint.setXfermode(null); return bitmap; }最后再将最终的Bitmap绘制到画板上面@Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub Drawable dra=getDrawable(); Bitmap cilcleBitmap = getCircleBitmap(); Bitmap bitmap = combineBitmap(dra, cilcleBitmap); //canvas.drawColor(Color.GREEN); //canvas.drawColor(Color.GREEN); canvas.drawBitmap(bitmap, 0, 0, mPaint); }在布局中设置图片<LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.example.testcicledrawable.MyImageView" ><RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <com.example.testcicledrawable.MyImageView android:layout_width="80dp" android:layout_height="80dp" android:id="@+id/iv" android:src="@drawable/pic" android:layout_centerInParent="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/iv" android:text="hehehhehehehhehehehehhehehehhehehhehehehehehhehehehehehheheheh"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="qianxiqianxiqianxiqianxiqianxiqianxiqianxiqianxiqianxi" android:layout_toRightOf="@id/iv"/></RelativeLayout> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"/></LinearLayout>最后根据你设置的图片大小设置当前画板的尺寸与图片相同private Paint mPaint; private int mRadius; private Bitmap mCircleBitmap; public MyImageView(Context context) { super(context); // TODO Auto-generated constructor stub mPaint=new Paint(); mRadius=dip2px(context, 80f)/2; } public MyImageView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub mPaint=new Paint(); mRadius=dip2px(context, 80f)/2; } public MyImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub mPaint=new Paint(); mRadius=dip2px(context, 80f)/2; } /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } 在主activity里可以直接当imageview使用设置对应的要显示的图片,记得自定义的view要继承imageview,,最好压缩一下,图片太大占内存。以上。
新闻热点
疑难解答