安卓开发之自定义View------> 圆形头像ImageView

安卓小白学习笔记,欢迎大家来一起交流,转载请注明出处~

安卓开发之自定义View——> 圆形头像ImageView,先贴效果图↓
这里写图片描述

一般自己写自定义View有两种方式
1、新建class继承View类然后重写构造器,以及重写三个方法:onMeasure,onLayout,onDraw
ps:比较麻烦,什么都得自己写,不好玩,小白表示有难度

2、新建class继承官方已有的View或者ViewGroup然后重写构造器,然后添加或者重写一些方法
ps:对于一个View相关的辅助功能方法扩展,官方都已经写得很全面,而且有些方法还不用自己重写了,只去写跟自己View相关的一些方法就好

下面要讲自定义View采用第二种方法


自定义View起名CircleImageView 继承ImageView,然后这里重写了三个父类构造方法
同时稍作修改,使每一个构造方法被调用都指向三个参数的构造方法。

public class CircleImageView extends ImageView{
    public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context,attrs);//这句是自己添加的自定义属性时候会调用到的自定义方法,下面会提到
    }
    public CircleImageView(Context context, AttributeSet attrs) {
        this(context, attrs,0);//稍作修改,使其都调用三个参数的方法,减少后面自定义属性时候的代码编写量,小白偷懒咯
    }
    public CircleImageView(Context context) {
        this(context,null);//稍作修改,使其都调用三个参数的方法,减少后面自定义属性时候的代码编写量,小白偷懒咯
    }

目前我知道两种画出一个圆形的方式
1、用 Canvas画布类+Paint画笔类形式画出圆形得到Bitmap对象,核心代码↓

/**
         * Bitmap bm          用于构建canvas对象
         * Bitmap iamgeBitmap 要变圆显示的图片(Bitmap对象形式)
         * Canvas canvas      画布对象 调用相关方法绘制到bm上
         * Paint  paint       画笔对象  设置相关属性方法等 绘制图形
         */
Bitmap bm=Bitmap.createBitmap(200, 200, Config.ARGB_8888);
        Canvas canvas= new Canvas(bm);
        Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.BLUE);
        //shader着色器,有兴趣的可以去看看,我只知道三种形式渐变等
        Shader shader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
        paint.paint.setShader(shader);
        canvas.drawCircle(100, 100, 100, paint);

2、利用图形混合模式 Xfermode类得到Bitmap对象
图形混合模式是用来处理两幅有相交区域图形的一些列的算法,采用不同的混合模式可以产生不同的效果
安卓中一共有18种混合模式,比较常用的有SRC_IN DST_IN等 核心代码↓

        //1.先绘制一个圆形
        Bitmap bm=Bitmap.createBitmap(200,200,Config.ARGB_8888);
        Canvas canvas=new Canvas(bm);
        Paint paint=new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.BLUE);
        canvas.drawCircle(100, 100, 95, paint);
        //2.设置paint.setXfermode同时给定混合参数  来画要变圆的图像
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.cc5);
        bitmap=Bitmap.createScaledBitmap(bitmap, 200, 200, true);
        canvas.drawBitmap(bitmap, 0, 0, paint);
        iv.setImageBitmap(bm);

有时候图形外围加一圈边框也挺好看,
半径比圆形图片稍大点画就好,核心代码↓

        paint.reset();
        paint.setAntiAlias(true);
        paint.setStyle(Style.STROKE);
        paint.setColor(Color.RED);
        paint.setStrokeWidth(2);
        canvas.drawCircle(100, 100, 100, paint);

来看效果图↓
这里写图片描述
是不是更加卡哇伊,当然颜色可以自己设置,宽度也可以自己给出,这里就涉及到了自定义view的自定义属性设置。核心代码↓

设置属性分两步
第一步 :在values文件夹下新建attrs.xml文件~核心代码↓

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

第二步,在.java写获得属性的方法。核心代码↓

private void init(Context context, AttributeSet attrs) {
        TypedArray t = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView);
        borderColor = t.getColor(R.styleable.CircleImageView_border_color, Color.WHITE);
        borderWidth = t.getDimensionPixelSize(R.styleable.CircleImageView_border_width, 2);
        t.recycle();
    }

OK——>接下来我们的自定义View就可以去使用了
来看使用的时候布局文件怎么写,核心代码↓

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    //使用自定义属性需要命名空间,空间名字随便写xmlns:zeze="http://schemas.android.com/apk/res/com.example.canvasdemo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >
   //使用自己控件的时候,输入包名类名就可以
    <com.example.canvasdemo.CircleImageView
        android:id="@+id/iv"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerInParent="true"
        android:scaleType="center"
        zeze:border_color = "#ff00ffff"
        zeze:border_width = "2dp"
       />
//设置自己的属性就写自己的空间然后可以提示出来
</RelativeLayout>

简简单单的自定义View,大神勿喷,有错欢迎指正,谢谢大家阅读

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值