zoukankan      html  css  js  c++  java
  • Android自己定义圆角ImageView

    我们常常看到一些app中能够显示圆角图片。比方qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然假设没有圆角图片资源。我们也能够自己通过程序实现的,以下介绍一个自己定义圆角ImageView的方法:

    package com.yulongfei.imageview;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    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;
    
    public class RoundAngleImageView extends ImageView {
    	private int roundWidth = 13;
    	private int roundHeight = 13;
    
    	public RoundAngleImageView(Context context) {
    		super(context);
    		init(context, null);
    	}
    
    	public RoundAngleImageView(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    		init(context, attrs);
    	}
    
    	public RoundAngleImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		init(context, attrs);
    	}
    
    	private void init(Context context, AttributeSet attrs) {
    		if (attrs != null) {
    			TypedArray a = context.obtainStyledAttributes(attrs,
    					R.styleable.RoundAngleImageView);
    			roundWidth = a.getDimensionPixelSize(
    					R.styleable.RoundAngleImageView_roundWidth, roundWidth);
    			roundHeight = a.getDimensionPixelSize(
    					R.styleable.RoundAngleImageView_roundHeight, roundHeight);
    			a.recycle();
    		} else {
    			float density = context.getResources().getDisplayMetrics().density;
    			roundWidth = (int)(roundWidth * density);
    			roundHeight = (int)(roundHeight * density);
    		}
    	}
    
    	/** 重写draw() */
    	@Override
    	public void draw(Canvas canvas) {
    		
    		//实例化一个和ImageView一样大小的bitmap
    		Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),
    				Config.ARGB_8888);
    		
    		//实例化一个canvas,这个canvas相应的内存为上面的bitmap
    		Canvas canvas2 = new Canvas(bitmap);
    		if (bitmap.isRecycled()) {
    			bitmap = Bitmap.createBitmap(getWidth(), getHeight(),
    					Config.ARGB_8888);
    			canvas2 = new Canvas(bitmap);
    		}
    		
    		//将imageView自己绘制到canvas2上,这个导致bitmap里面存放了imageView
    		super.draw(canvas2);
    		
    		//利用canvas画一个圆角矩形,这个会改动bitmap的数据
    		drawRoundAngle(canvas2);
    		
    		//将裁剪好的bitmap绘制到系统当前canvas上,这样裁剪好的imageview就能显示到屏幕上
    		Paint paint = new Paint();
    		paint.setXfermode(null);
    		canvas.drawBitmap(bitmap, 0, 0, paint);
    		bitmap.recycle();
    	}
    
    	public void setRoundWidth(int roundWidth, int roundHeight) {
    		this.roundWidth = roundWidth;
    		this.roundHeight = roundHeight;
    	}
    
    	private void drawRoundAngle(Canvas canvas)
    	{
    		Paint maskPaint = new Paint();
            maskPaint.setAntiAlias(true);
    		maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
            Path maskPath = new Path();  
            maskPath.addRoundRect(new RectF(0.0F, 0.0F, getWidth(), getHeight()), roundWidth, roundHeight, Path.Direction.CW);
            
            //这是设置了填充模式。很关键
            maskPath.setFillType(Path.FillType.INVERSE_WINDING);
            canvas.drawPath(maskPath, maskPaint);
    	}
    }
    

  • 相关阅读:
    Spring Mvc和Mybatis的多数据库访问配置过程
    Git下解决冲突
    安装Git
    数据库优化
    Ubuntu版 微信
    ssh框架简介
    写代码的习惯
    CentOS 7 安装 docker 并搭建私有仓库
    IPv4地址分类及特征
    Xcode 7.0 Could not find developer disk image
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6849149.html
Copyright © 2011-2022 走看看