安卓小白学习笔记,欢迎大家来一起交流,转载请注明出处~
安卓开发之自定义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文件~核心代码↓
<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"
>
//使用自己控件的时候,输入包名类名就可以
"
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,大神勿喷,有错欢迎指正,谢谢大家阅读