自定义圆形ImageView

        首先我们需要一个圆形的图片,但是不可能美工把所有的图片都给你处理,那么我们就需要自己定义了.

         首先我们需要在建一个class集成ImageView,然后重写其构造方法,这里我们重写其2个参数的构造方法,


在res/values/  下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。

    public class CircleView extends ImageView{


             public CircleView(Context context, AttributeSet attrs) {
                     super(context, attrs);
             }

    }

   
    //*onMeasure()//初步确定控件尺寸   ...一般不建议重写
    //*onLayout()//决定子控件如何的摆放
    //onDraw()


attrs.xml文件

     <?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CircleView">
        <attr name="border_width" format="dimension"></attr>
        <attr name="border_color" format="color"></attr>
    </declare-styleable>
</resources>


在我们的activity_main.xml中添加我们的自定义View

下面红色部分是它的命名空间 res/后是我们的包名

这样才能在其属性中添加(因为用的是eclipse,有时候不会自动提示,这时你可以重启一下你的eclipse  ,这样就可以自动提示出来了)

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:apple="http://schemas.android.com/apk/res/com.example.myviewdemo"    
    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"
    tools:context=".MainActivity" >

   <com.example.myviewdemo.CircleView
       android:id="@+id/cv"
       android:layout_width="200dp"
       android:layout_height="200dp"
       android:layout_centerInParent="true"
       android:src="@drawable/ic_launcher"
       apple:border_width="2dp"
       apple:border_color="#ff00ff00"

       ></com.example.myviewdemo.CircleView>
</RelativeLayout>


     再重写其中的setImageBitmap方法

     /**
     * 改写ImageView默认的setImageBitmap方法
     */
    @Override
    public void setImageBitmap(Bitmap bm) {
        //bm---xfermode--->bitmap
        Bitmap bitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.BLACK);
        float radius = Math.min(bm.getWidth(), bm.getHeight())/2;
        canvas.drawCircle(bm.getWidth()/2, bm.getHeight()/2, radius , paint);
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bm, 0, 0, paint);
        
        paint.setStyle(Style.STROKE);
        paint.setStrokeWidth(borderWidth);
        paint.setColor(borderColor);
        canvas.drawCircle(bm.getWidth()/2, bm.getHeight()/2, radius-borderWidth/2, paint);
        
        setScaleType(ScaleType.FIT_CENTER);
        super.setImageBitmap(bitmap);
    }

虽然上面都做好了,但是系统还是不知道我们的属性:我们还需要在自定义View里面添加其属性:

     public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray t = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
        borderWidth = t.getDimensionPixelSize(R.styleable.CircleView_border_width, 0);
        borderColor = t.getColor(R.styleable.CircleView_border_color, Color.WHITE);
        t.recycle();
    }

  OK!上面的做好了你只要在MainActivity中初始化一下我们的控件,给其指定一个别的图片就可以了..

  

     CircleView cv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        cv = (CircleView) findViewById(R.id.cv);
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.b);
        cv.setImageBitmap(bm);
    }


  这里还需要注意一点,,,那就是我们没有对Bitmap进行压缩,所以在模拟器上运行的同学选择图片的时候不要选择大图片,那样容易出现:

1,OOM  OutOfMemory   内存溢出;

2,显示出来了但还是之前的样式矩形图片....

以上就是我总结的一些基础吧,希望对大家有所帮助!


   


   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值