安卓自定义view

萝らか妹 提交于 2020-03-08 18:34:31

1.什么是view?
view就是屏幕上一个界面ui显示的基础对象。安卓的界面显示都是文字,图片一层层组合或者叠加展示出来的,就好比我们在用word编辑一样,在原来的空白的编辑板上放置的一个文字,一张图片,一个表格等排版组合一样。这里一个文字,一张图片,一个表格都可以类比一个view。

2.view属性
我们在显示word文档上的文字以及图片,以及表格等等都可以设置他们大小,颜色等格式或者其他更炫的样式,在安卓同样view也可以设置他们的大小或者颜色等等格式,安卓统称这些格式或者样式为view的属性。view的属性如下表:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.自定义view。
虽然安卓已经给我们提供了很丰富的view对象了,例如显示文字的TextView,显示图片的ImageView等。但是有时候我们显示些复杂的或者特别的文字图像显示的时候,就只能通过TextView跟ImageView组合来显示了,虽然说这样显示也没有问题,但是如果是通过多个TextView以及ImageView才能达到我们显示效果的话,那么的系统的开销也会大大加大。以为一般比较特别以及负责的显示我们可以通过继承view来绘画出自己想要的界面显示。这就是自定义view。
简单理解就是自定义view自己想怎么显示就怎么显示。

4.重写显示方法
(1)重写onDraw,该方法主要是绘画内容,也就是想要显示的内容都会在这方法绘画
(2)重写onMeasure 该方法主要是测量view的大小

package com.gentle.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import java.util.Random;

import android.util.Log;
import android.view.View;

import com.gentle.gentleview.R;


public class MyView extends View {

    private int centor_x;
    private int centor_y;
    private int radius;
    private Paint mPaint;

    public MyView(Context context){
        this(context,null);
    }

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

	//初始画笔paint以及自定义化属性
    private void init(Context context,AttributeSet attrs){
        mPaint = new Paint();
        mPaint.setColor(Color.BLUE);//设置画笔颜色

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.customStyleView);
        centor_x = typedArray.getInt(R.styleable.customStyleView_centor_x,0);
        centor_y = typedArray.getInt(R.styleable.customStyleView_centor_y,0);
        radius = typedArray.getInt(R.styleable.customStyleView_radius,0);
        typedArray.recycle();//底层二进制数据缓冲区对象,务必记得利用recycle回收

		//设置默认值
        if(centor_x== 0)
            centor_x = 100;

        if(centor_y == 0)
            centor_y = 100;

        if(radius == 0)
            radius = 50;

    }

    @Override
    protected void onDraw(Canvas canvas) {
       canvas.drawCircle(centor_x,centor_y,radius,mPaint);//画圆
    }

    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
    }

	//重写测量方法,测量控件的大小
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width ;
        int height;
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);

        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        if(widthMode == MeasureSpec.EXACTLY){
            width = widthSize ;
        }else {
            width = (int) (centor_x +2*radius);
        }

        if(heightMode == MeasureSpec.EXACTLY){
            height = heightSize ;
        }else {
            height = (int) (centor_y + 2*radius );
        }

        setMeasuredDimension(width,height);
    }
}

5.xml以及自定义属性
(1)在value目录下新建自定义属性attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="customStyleView">
        <attr name="centor_x" format="integer"/>
        <attr name="centor_y" format="integer"/>
        <attr name="radius" format="integer"/>
    </declare-styleable>
</resources>

(2)在xml中配置

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.gentle.view.MyView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        app:sweepAngleAdd = "10"
        app:centor_x = "150"
        app:centor_y = "150"
        app:radius = "100"/>

</androidx.constraintlayout.widget.ConstraintLayout>

注意:<com.gentle.view.MyView是代表自定义的view包路径
app:centor_x是因为上面有着 xmlns:app=“http://schemas.android.com/apk/res-auto”,至于为什么,我想因为是资源来自本apk的意思吧。

(3)在自定义view初始化init的时候获取属性值

   private void init(Context context,AttributeSet attrs){
        mPaint = new Paint();//初始化画笔
        mPaint.setColor(Color.BLUE);//设置画笔颜色

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.customStyleView);
        centor_x = typedArray.getInt(R.styleable.customStyleView_centor_x,0);
        centor_y = typedArray.getInt(R.styleable.customStyleView_centor_y,0);
        radius = typedArray.getInt(R.styleable.customStyleView_radius,0);
        typedArray.recycle();//底层二进制数据缓冲区对象,务必记得利用recycle回收

		//当没有配置属性的时候的默认值
        if(centor_x== 0)
            centor_x = 100;

        if(centor_y == 0)
            centor_y = 100;

        if(radius == 0)
            radius = 50;

    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!