自定义ImageView的学习

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.Xfermode;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

@SuppressLint("DrawAllocation")
public class CircleImageView extends ImageView {
	private static final Xfermode MASK_XFERMODE;
	private Bitmap mask;
	private Paint paint;

	static {
		/** 7.PorterDuff.Mode.DST_IN
  				取两层绘制交集。显示下层。*/
		PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;
		MASK_XFERMODE = new PorterDuffXfermode(localMode);
	}

	public CircleImageView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public CircleImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void onDraw(Canvas paramCanvas) { // 这里就是重写的方法了,想画什么形状自己动手
		Drawable localDrawable = getDrawable();
		if (localDrawable == null)
			return;
		try {
			if (this.paint == null) {
				Paint localPaint1 = new Paint();
				this.paint = localPaint1;
				this.paint.setFilterBitmap(false);
				Paint localPaint2 = this.paint;
				Xfermode localXfermode1 = MASK_XFERMODE;
				@SuppressWarnings("unused")
				Xfermode localXfermode2 = localPaint2
						.setXfermode(localXfermode1);
			}
			float f1 = getWidth();
			float f2 = getHeight();
			
			/**saveLayer(float left,
                     float top,
                     float right,
                     float bottom,
                     Paint paint,
                     int saveFlags)*/
			int i = paramCanvas.saveLayer(0.0F, 0.0F, f1, f2, null, 31);
			
			int j = getWidth();
			int k = getHeight();
			localDrawable.setBounds(0, 0, j, k);
			localDrawable.draw(paramCanvas);
			if ((this.mask == null) || (this.mask.isRecycled())) {
				Bitmap localBitmap1 = createMask();
				this.mask = localBitmap1;
			}
			Bitmap localBitmap2 = this.mask;
			Paint localPaint3 = this.paint;
			paramCanvas.drawBitmap(localBitmap2, 0.0F, 0.0F, localPaint3);
			
			/**public void restoreToCount(int saveCount)
			 * Efficient way to pop any calls to save() that happened after the save count reached saveCount. 
			 * It is an error for saveCount to be less than 1. Example: int count = canvas.save(); ... 
			 * // more calls potentially to save() canvas.restoreToCount(count); 
			 * // now the canvas is back in the same state it was before the initial 
			 * // call to save(). 
				参数:
					saveCount - The save level to restore to. */
			paramCanvas.restoreToCount(i);
			
			return;
		} catch (Exception localException) {
			StringBuilder localStringBuilder = new StringBuilder()
					.append("Attempting to draw with recycled bitmap. View ID = ");
			System.out.println("localStringBuilder==" + localStringBuilder);
		}
	}

	private Bitmap createMask() {
		int i = getWidth();
		int j = getHeight();
		Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;
		Bitmap localBitmap = Bitmap.createBitmap(i, j, localConfig);
		Canvas localCanvas = new Canvas(localBitmap);
		Paint localPaint = new Paint(1);
		localPaint.setColor(-16777216);
		float f1 = getWidth();
		float f2 = getHeight();
		
		/**  RectF(float left,float top,float right,float bottom) */
		RectF localRectF = new RectF(0.0F, 0.0F, f1, f2);

		/**drawRect(rect, localPaint)
			drawRect(left, top, right, bottom, localPaint)
			drawCircle(cx, cy, radius, localPaint)
			drawRoundRect(rect, rx, ry, localPaint)*/
		localCanvas.drawOval(localRectF, localPaint);
		/**		drawOval (RectF oval, Paint paint)   drawRect/drawCicle
		 * 		oval:椭圆外切矩形的RectF对象。
		 *		paint:绘制时所使用的画笔
		 */
		return localBitmap;
	}
	
	/**
	 * 
     * 绘制不同的图形Bitmap
     *
    private Bitmap getDrawBitmap(){
        Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),  
                Bitmap.Config.ARGB_8888);  
        Canvas canvas = new Canvas(bitmap);  
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
        paint.setColor(Color.BLACK);  
  
        if(mType == TYPE_CIRCLE)
        {//绘制圆形 
            canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2,  
                    paint); 
        }else if(mType == TYPE_ROUND)  
        {//绘制圆角矩形
            canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()),  
                    mRoundBorderRadius, mRoundBorderRadius, paint);  
        }else if(mType == TYPE_OVAL ){
         //绘制椭圆
            canvas.drawOval(new RectF(0, 0, getWidth(), getHeight()), mPaint);
        }
  
        return bitmap;  
    }
	 */
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值