浅谈自定义view

来源:互联网 发布:手机怎么注册淘宝小号 编辑:程序博客网 时间:2024/06/04 01:01

    在工作中会遇到一些安卓系统的控件满足不了业务需求,这样自定义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;//高@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {    super.onSizeChanged(w, h, oldw, oldh);    width = getResources().getDisplayMetrics().widthPixels;    height = getResources().getDisplayMetrics().heightPixels;}

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

//定义个方法初始化画笔paintPaint paint;public void initPaint() {    paint = new Paint();    //设置画笔属性 抗锯齿    paint.setAntiAlias(true);    //设置防抖动    paint.setDither(true);}

//在onDraw方法里面绘画

//重写onDraw方法绘制view@Overrideprotected 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里面建个文件夹 (命名自定义的类名+attrs)

<?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@Overrideprotected 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


0 0