浅谈自定义view

    在工作中会遇到一些安卓系统的控件满足不了业务需求,这样自定义view就可以解决这个问题了。

 

首选创建个类继承view或者其子类(如果继承imagview就有imageview属性)这样了以view为例子

自定义view类java代码:

重写两个构造方法

 

public class MyView extends View {

    //重写他两个构造方法
    //这个构造方法用于在java代码创建自定义的view对象
    public MyView(Context context) {
        super(context);
        //初始画笔
        initPaint();
    }
//这个构造方法用于在XML代码创建自定义的view对象
public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    //初始画笔
    initPaint();

 

 

 

//获取屏幕宽高

 

//重写onSizeChanged方法里面可以获取系统宽高
//定义个变量为系统宽
int width;//宽
int height;//高

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    width = getResources().getDisplayMetrics().widthPixels;
    height = getResources().getDisplayMetrics().heightPixels;
}

 

 

 

//定义个方法初始化画笔(注意在两个构造方法里面要调用这个方法才可以初始化)

 

//定义个方法初始化画笔paint
Paint paint;

public void initPaint() {
    paint = new Paint();
    //设置画笔属性 抗锯齿
    paint.setAntiAlias(true);
    //设置防抖动
    paint.setDither(true);

}

 

 

 

//在onDraw方法里面绘画

 

//重写onDraw方法绘制view
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

 

 

 

//定义自定义view的特有属性

 

//定义属性
//比如定义这个view最大值和颜色
//为java代码设置默认值
protected int viewColor = Color.GRAY;
protected int max = 100;

public int getViewColor() {
    return viewColor;
}

public void setViewColor(int viewColor) {
    this.viewColor = viewColor;
}

public int getMax() {
    return max;
}

public void setMax(int max) {
    this.max = max;
}

 

 

 

//在res里面的values的建个attrs.xml 

 

<?xml version="1.0" encoding="utf-8"?>
<!--在这里定义的属性 XML才可以设置自定义属性-->
<!--  注意文件命名是自定义view类名+attrs  --><!-- declare-styleable 定义名称一般以类名定义 ;
attr name指在java定义的属性 ; format指定义的属性是上面类型  -->

<resources>

    <declare-styleable name="MyView">
        <attr name="max" format="integer" />
        <attr name="viewColor" format="color" />
    </declare-styleable>

</resources>

 

 

 

//在构双参造方法里面设置属性

 

//这个构造方法用于在XML代码创建自定义的view对象
public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    //初始画笔
    initPaint();

    //XML代码才会执行这个方法

    //通过typeArray从attrs里面将xml中设置的属性拿出来
    //括号参数(attrs对象可以直接在构造方法参数里面获取,通过R.styleable点命名的名称)
    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyView);
    //括号参数(对应attrs文件里面的名称,默认值)
    max = ta.getInt(R.styleable.MyView_max, 100);
    viewColor = ta.getColor(R.styleable.MyView_viewColor, Color.GREEN);
    //注意自定义属性 最后必须关闭 不然会内存泄露
    ta.recycle();//关闭


}

 

 

 

//XML引用自定义view和设置自定义属性

 

xmlns:app="http://schemas.android.com/apk/res-auto"就是导入自定义的-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.viewdemo.MainActivity">

    <!--使用app引用自定义属性-->
    <com.example.viewdemo.MyView
        app:viewColor="@android:color/holo_orange_light"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:max="50" />

</RelativeLayout>

 

 

 

//在mainactivity获取和设置自定义view

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //java代码引用
        MyView view = new MyView(this);
        //在java代码设置自定义属性
//        view.setMax(88);
//        view.setViewColor(Color.GRAY);
        setContentView(view);

         //引用XML布局
       // setContentView(R.layout.activity_main);


    }
}

 

 

 

//这里说下在OnDraw方法里面的基本使用

 

//重写onDraw方法绘制view
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //通过画笔定义绘画的颜色,实体还是空心。。。

    //定义画笔颜色
    //引用系统颜色
    // paint.setColor(Color.RED);
    //括号参数(透明度,红,绿,蓝)(值都是0-255整数型)
    // paint.setARGB(0x01, 0x25, 0x11, 0x22);
    //设置透明度括号参数是0-255整数;注意要先设置颜色再设置透明度,透明度才有效
    //paint.setAlpha(22);

    //设置画笔的宽度(float值)
    paint.setStrokeWidth(5);

    //设置渐变setShader
    //括号(起始点距离X距离,起始距离Y距离,终点距离X距离,终点距离Y距离,起始颜色,终点颜色,模式一般Shader.TileMode.MIRROR)
    LinearGradient linearGradient = new LinearGradient(0, 0, width, height, Color.GRAY, Color.BLUE, Shader.TileMode.MIRROR);
    //系统提供linearGradient线性渐变,//径向渐变RadialGradient(颜色由里面向外面变)//角度渐变SweepGradient像雷达样变化以水平右边为启动
    //paint.setShader(linearGradient);

    //设置样式
    //为`Style.FILL 填充满`、`Style.FILL_AND_STROKE 填充满有边框`或`Style.STROKE只有边框`
    paint.setStyle(Paint.Style.STROKE);

    //通过canvas绘制很多图型

    //绘制圆
    // 括号参数(水平移动距离(距离Y距离),垂直移动距离(距离X距离),半径,画笔)通过前面两参数确定一个点为圆心
    //注意:括号X是负数向左水平移动,Y是负数向上移动;以屏幕左上角为原点
    // canvas.drawCircle(50, -10, 30, paint);


    //括号参数(前面两个距离确定一个点,后面两个距离确定一个点,两个点画个矩形或者正方形)
    RectF rectf = new RectF(200, 300, 500, 600);

    //椭圆
    //   canvas.drawRect(rectf, paint);

    //同一只画笔可以在画之前定义不同颜色
    //引用系统颜色
    //  paint.setColor(Color.BLUE);


    //文本
    // 括号参数(自定义文本,X平移,Y平移,画笔)
    paint.setStrokeWidth(1);
    //设置字体大小
    paint.setTextSize(80);
    //引用自定义颜色属性
    paint.setColor(viewColor);
    //引用自定义int值属性
    canvas.drawText(max + "你好", 110, 110, paint);

    //弧形
    // 括号参数(椭圆对象,起始角度,需要画的角度,是否有连线,画笔)
    //水平为起始角度顺时针为正角度
    canvas.drawArc(rectf, -180, 90, true, paint);


    //线
    //括号前面两个确定起始点后面两个确定终点,画笔
    // canvas.drawLine(0, 0, width, height, paint);

    //点
    //  canvas.drawPoint(110, 10, paint);


}

 

 

 

//总结自定义view

创建个类继承view或者其子类;

重写两个构造方法

如果要定义view属性 先定义属性对象,设置set和get方法 

在res里面建个attrs文件夹 里面设置定义属性具体类型

再在双参构造方法里面设置属性

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyView);

 

这样就可以在xml和java代码中使用自定义view

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值