自定义View

MainActivity

package bw.com.bw_day04;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import bw.com.bw_day04.demo01.CustomViewActivity01;
import bw.com.bw_day04.demo02.CustomViewActivity02;
import bw.com.bw_day04.demo03.CustomViewActivity03;
import bw.com.bw_day04.demo04.CustomViewActivity04;
import bw.com.bw_day04.demo05.CustomViewActivity05;
import bw.com.bw_day04.demo06.CustomViewActivity06;
import bw.com.bw_day04.demo07.CustomViewActivity07;
import bw.com.bw_day04.demo08.CustomViewActivity08;
import bw.com.bw_day04.demo09.CustomViewActivity09;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClick(View view) {
        Intent intent = new Intent();

        switch (view.getId())
        {
            case R.id.but_01:
                intent.setClass(this,CustomViewActivity01.class);
                break;
            case R.id.but_02:
                intent.setClass(this,CustomViewActivity02.class);
                break;
            case R.id.but_03:
                intent.setClass(this,CustomViewActivity03.class);
                break;
            case R.id.but_04:
                intent.setClass(this,CustomViewActivity04.class);
                break;
            case R.id.but_05:
                intent.setClass(this,CustomViewActivity05.class);
                break;
            case R.id.but_06:
                intent.setClass(this,CustomViewActivity06.class);
                break;
            case R.id.but_07:
                intent.setClass(this,CustomViewActivity07.class);
                break;
            case R.id.but_08:
                intent.setClass(this,CustomViewActivity08.class);
                break;
            case R.id.but_09:
                intent.setClass(this,CustomViewActivity09.class);
                break;
        }
        startActivity(intent);
    }
}
Demo01

CustomViewActivity01

package bw.com.bw_day04.demo01;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import bw.com.bw_day04.R;

public class CustomViewActivity01 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view01);
    }
}
CustomView01
package bw.com.bw_day04.demo01;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

/**
 * 绘制
 *   圆, 线, 文字, 矩形, 扇形
 */

//todo 1, 定义一个类, 继承View, 重写2个构造方法
public class CustomView01 extends View{

    public CustomView01(Context context) {
        super(context);
    }

    public CustomView01(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    //TODO 2, 重写父类的绘制方法 ,  参数 : Canvas canvas 画布
    //todo  最后绘制的内容, 出现在最上方
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //更改画布的颜色
        canvas.drawColor(Color.YELLOW);

        //声明画笔
        Paint paint = new Paint();
        paint.setColor(Color.RED);//设置画笔的颜色
        paint.setTextSize(30);//设置位置的大小  px
        paint.setStrokeWidth(5);//设置画笔的粗细
        paint.setAntiAlias(true);//设置抗锯齿

        //绘制线
        canvas.drawLine(0,0,600,600,paint);//X起始,Y起始,X结束,Y结束,画笔

        //绘制圆
        paint.setColor(Color.BLUE);
        //设置画笔的样式  Paint.Style.FILL  实心(默认);  Paint.Style.STROKE 空心
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(600,600,100,paint);//圆心X , 圆心Y , 半径 , 画笔

        //绘制矩形
        canvas.drawRect(0,0,600,600,paint);//左, 上, 右 ,下, 画笔

        //绘制文字
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawText("我吃辣条, 你吃辣条袋袋......",200,200,paint);//显示的内容, X轴的起始, Y轴的起始, 画笔

        //绘制扇形  -- 重点
       //必须给扇形绘制外轮廓的矩形
        RectF rectF = new RectF(0,0,600,600);
        canvas.drawArc(rectF,0,120,true,paint);//外轮廓矩形, 开始的角度, 扫描的角度, 中心, 画笔

    }

    //测量的方法  -- 测量自己
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        //得到测量的模式
        int wMode = MeasureSpec.getMode(widthMeasureSpec);
        int hMode = MeasureSpec.getMode(heightMeasureSpec);

        //声明显示的尺寸
        int wSize = 0;
        int hSize = 0;

       switch (wMode)
       {
           case MeasureSpec.AT_MOST:
               wSize = 700;
               break;

           case MeasureSpec.EXACTLY:
               wSize=1000;
               break;
       }

       switch (hMode)
       {
           case MeasureSpec.AT_MOST:
               hSize = 700;
               break;
           case MeasureSpec.EXACTLY:
               hSize = 1000;
               break;
       }

       //得到了宽度和高度的值  ,  将获取的值, 设置到控件中
        setMeasuredDimension(wSize,hSize);
    }
}
FancxView
package bw.com.bw_day04.demo01;

import android.content.Context;
import android.graphics.Canvas;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

/**
 * 自定义View 中, 重要方法介绍
 *
 * 控件
 *   页面      <  包名.FancxView  />
 *  Activity      FancxView view = new FancxView(this);
 *
 * 1, 定义一个类, 继承View
 * 2, 重写父类的构造方法
 * 3, 重写父类的主要方法  -- 绘制, 测量, 排版
 *
 */

public class FancxView extends View{

    public FancxView(Context context) {//上下文对象
        super(context);
        //TODO 在java 代码中创建控件, 调用的构造方法
    }

    public FancxView(Context context, @Nullable AttributeSet attrs) {//上下文对象, 属性集
        super(context, attrs);
        //TODO 在布局页面中, 使用控件调用的构造方法
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //TODO 绘制方法
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //TODO 测量方法 --- 测量当前控件本身
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        //TODO 排版布局的方法 -- 容器中使用(继承ViewGroup及其子类), 排版当前容器中, 子控件的摆放位置
    }
}
Demo02

CustomViewActivity02

package bw.com.bw_day04.demo02;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import bw.com.bw_day04.R;

public class CustomViewActivity02 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view02);
    }

    public void onClick(View view) {

        Toast.makeText(this, "你点击了继承Button的按钮", Toast.LENGTH_SHORT).show();
    }
}
MyButton
package bw.com.bw_day04.demo02;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

/**
 * 创建自定义的控件, 实现点击事件监听器
 */

public class MyButton extends View implements View.OnClickListener{

    private int index = 0;//按钮显示的数字

    public MyButton(Context context) {
        super(context);
    }

    public MyButton(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        //设置点击事件监听器
        setOnClickListener(this);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //1, 声明画笔
        Paint paint = new Paint();

        //2, 绘制矩形
        paint.setColor(Color.GRAY);
        canvas.drawRect(100,100,800,800,paint);

        //3, 绘制显示的内容
        paint.setColor(Color.RED);
        paint.setTextSize(100);
        canvas.drawText("当前数字" + index,200,450,paint );
    }

    //点击事件监听器
    @Override
    public void onClick(View v) {

        index++;
        //重新绘制 -- 再次调用onDraw()
        invalidate();

    }
}
MyButton02
  
package bw.com.bw_day04.demo02;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v7.widget.AppCompatButton;
import android.util.AttributeSet;

/**
 * 继承已有控件 Button  -- v7包中   AppCompatButton
 */

public class MyButton02  extends AppCompatButton{

    public MyButton02(Context context) {
        super(context);
    }

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

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //1, 声明画笔对象
        Paint paint = new Paint();
        paint.setColor(Color.RED);

        //2, 绘制图形
        //getWidth() 当前控件的宽度    getHeight() 当前控件的高度
        canvas.drawCircle(getWidth()/2,getHeight()/2,30,paint);
    }
}

demo03

  CustomViewActivity03
    

package bw.com.bw_day04.demo03;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import bw.com.bw_day04.R;

public class CustomViewActivity03 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view03);
    }
}
MyTextView
package bw.com.bw_day04.demo03;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

import bw.com.bw_day04.R;

/**
 * 继承View
 */

public class MyTextView extends View{

    private String content;//内容
    private int titleColor;//文字的颜色
    private float titleSize;//文字的大小

    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        //1, 从属性列表中, 得到数值的类
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyTextView);

        //2, 获取属性值
        content = typedArray.getString(R.styleable.MyTextView_titleText);
        titleColor = typedArray.getColor(R.styleable.MyTextView_titleColor, Color.BLACK);
        titleSize = typedArray.getDimension(R.styleable.MyTextView_titleSize,20);
        //3, 绘制  -- onDraw()

        //4, 及时回收资源
        typedArray.recycle();
    }

    //绘制内容  -- 根据属性传入的属性值来绘制
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(titleColor);
        paint.setTextSize(titleSize);
        canvas.drawText(content,100,100,paint);
    }
}
Demo04

CustomViewActivity04

package bw.com.bw_day04.demo04;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import bw.com.bw_day04.R;

public class CustomViewActivity04 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view04);
    }
}
MyEditText

package bw.com.bw_day04.demo04;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v7.widget.AppCompatEditText;
import android.util.AttributeSet;
import android.view.Gravity;

/**
 *记事本  --- 继承已有的控件(EditText)
 */

public class MyEditText extends AppCompatEditText{

    //画笔
    private Paint paint;

    public MyEditText(Context context) {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);

        //初始化画笔
        paint = new Paint();
        paint.setStrokeWidth(5);//设置画笔的粗细
        paint.setColor(Color.RED);//设置颜色
        paint.setAntiAlias(true);//抗锯齿

        //设置从顶部开始绘制
        setGravity(Gravity.TOP);

        //设置内边距
        setPadding(50,0,50,0);

        //设置行与行的间隔
        //间隔的距离, 增加的倍数
        setLineSpacing(30,1);
    }

    //绘制  -- 绘制一页数据
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //1, 得到屏幕的高度
        int height = getHeight();

        //2, 得到每一行的高度
        int lineHeight = getLineHeight();

        //3, 行的数量
        int count =height/lineHeight;

        //4, 绘制 -- 循环绘制线
        for(int i = 0;i<count;i++)
        {
            canvas.drawLine(50,lineHeight*(i+1),getWidth()-50,lineHeight*(i+1),paint);
        }

        //TODO -----------如果超过屏, 循环绘制-----
        int lines = getLineCount();
        for(int i=0;i<lines;i++)
        {
            if (i>count)
            {
                canvas.drawLine(50,lineHeight*i,getWidth()-50,lineHeight*i,paint);
            }
        }

    }
}
Demo05
CustomView05

package bw.com.bw_day04.demo05;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

/**
 * 柱状图 -- 继承View
 */

public class CustomView05 extends View{

    private Paint paint;//画笔
    private int rect_width = 30;//柱子的宽度
    private int rect_space = 20;//柱子的间隔

    //柱子的颜色 + 柱子的高度
    private int[][]  rects = {{Color.RED,300},{Color.GREEN,400},{Color.BLUE,500},{Color.YELLOW,600}};

    public CustomView05(Context context) {
        super(context);
    }

    public CustomView05(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //初始化画笔
        paint = new Paint();
        paint.setStrokeWidth(5);
        paint.setAntiAlias(true);

        //绘制柱子
        if(rects!=null)
        {
            for(int i = 0;i<rects.length;i++)
            {
                //修改画笔
                paint.setColor(rects[i][0]);

                //绘制矩形
                int left = 50+rect_space+(rect_width+rect_space)*i;
                int top = getHeight() - 50 - rects[i][1];
                canvas.drawRect(left,top,left+rect_width,getHeight()-50,paint);
            }
        }

        paint.setColor(Color.BLACK);
        //绘制X轴
        canvas.drawLine(50,getHeight()-50,getWidth()-50,getHeight()-50,paint);
        canvas.drawLine(getWidth()-50,getHeight()-50,getWidth()-75,getHeight()-75,paint);
        canvas.drawLine(getWidth()-50,getHeight()-50,getWidth()-75,getHeight()-25,paint);

        //绘制Y轴
        canvas.drawLine(50,getHeight()-50,50,50,paint);
        canvas.drawLine(50,50,25,75,paint);
        canvas.drawLine(50,50,75,75,paint);

        //绘制XY的交汇
        canvas.drawCircle(50,getHeight()-50,5,paint);

        //绘制300对应的点
        canvas.drawCircle(50,getHeight()-350,5,paint);
        //绘制300的文字
        paint.setTextSize(30);
        canvas.drawText("300",10,getHeight()-350,paint);

    }
}
CustomViewActivity05

package bw.com.bw_day04.demo05;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import bw.com.bw_day04.R;

public class CustomViewActivity05 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view05);
    }
}
Demo06
CustomView06

package bw.com.bw_day04.demo06;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by Administrator on 2018/1/27.
 */

public class CustomView06 extends View {
    public CustomView06(Context context) {
        super(context);
    }

    public CustomView06(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setTextSize(30);

        //外轮廓的矩形
        RectF rectF = new RectF(0,0,500,500);

        //绘制第一个扇形
        paint.setColor(Color.RED);
        canvas.drawArc(rectF,0,90,true,paint);
        //绘制文字
        paint.setColor(Color.BLACK);
        canvas.drawRect(320,320,400,370,paint);
        paint.setColor(Color.WHITE);
        canvas.drawText("90",350,350,paint);

        //绘制第二个扇形
        paint.setColor(Color.GREEN);
        canvas.drawArc(rectF,90,110,true,paint);


        //绘制第三个扇形
        paint.setColor(Color.YELLOW);
        canvas.drawArc(rectF,200,90,true,paint);


        //绘制第四个扇形
        paint.setColor(Color.BLUE);
        canvas.drawArc(rectF,290,70,true,paint);

        //绘制中间的圆
        paint.setColor(Color.GREEN);
        canvas.drawCircle(250,250,80,paint);
        paint.setColor(Color.BLACK);
        canvas.drawText("Center",220,260,paint);

    }
}
CustomViewActivity06

package bw.com.bw_day04.demo06;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import bw.com.bw_day04.R;

public class CustomViewActivity06 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view06);
    }
}
Demo07

CustomView07

package bw.com.bw_day04.demo07;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by Administrator on 2018/1/27.
 */

public class CustomView07 extends View {

    private Paint paint;

    //默认圆形的XY轴
    private int currentX = 60;
    private int currentY = 60;

    public CustomView07(Context context) {
        super(context);
        initPaint();
    }

    public CustomView07(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }

    private void initPaint()
    {
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStrokeWidth(5);
        paint.setAntiAlias(true);
    }

    //绘制方法中, --- 绘制圆
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawCircle(currentX,currentY,50,paint);
    }

    //触摸的方法
    @Override
    public boolean onTouchEvent(MotionEvent event) {

        //获取手指触摸位置的X,Y
        currentX = (int) event.getX();
        currentY = (int) event.getY();

        //重写绘制的方法
        invalidate();
        //返回True, 代表事件被消费了
        return true;
    }
}
CustomViewActivity07

package bw.com.bw_day04.demo07;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import bw.com.bw_day04.R;

public class CustomViewActivity07 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view07);
    }
}
Demo08

CustomViewActivity08

package bw.com.bw_day04.demo08;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import bw.com.bw_day04.R;

public class CustomViewActivity08 extends AppCompatActivity {

    private TitleView mTitleView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view08);

        mTitleView = (TitleView) findViewById(R.id.title_view_id);
        
        mTitleView.setText("CustomViewActivity08的页面");
        mTitleView.getButton().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(CustomViewActivity08.this, "你点击了组合控件中的返回按钮!!!!!", Toast.LENGTH_SHORT).show();
            }
        });
    }
}
Main2Activity

package bw.com.bw_day04.demo08;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import bw.com.bw_day04.R;

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
    }
}
TitleView

package bw.com.bw_day04.demo08;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

import bw.com.bw_day04.R;

/**
 * 组合控件 --
 * 1, 定义一个类, 继承ViewGroup及其子类
 * 2, 加载一系列小控件组成的页面
 *
 */

public class TitleView  extends FrameLayout{


    private TextView tv;
    private ImageView iv;
    private Button button;

    public TitleView(@NonNull Context context) {
        super(context);
    }

    public TitleView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        //2, 加载一系列小控件的布局页面
        LayoutInflater.from(context).inflate(R.layout.title_view,this);//依附于当前的控件显示

        //3, 获取页面中的控件
        iv = (ImageView) findViewById(R.id.iv_id);
        tv = (TextView) findViewById(R.id.tv_id);
        button = (Button) findViewById(R.id.but_id);

    }

    //4, 向外提供一个公共的方法, 供外部修改文字
    public void setText(String info)
    {
        tv.setText(info);
    }

    //5, 向外提供一个公共的方法, 返回当前的按钮对象
    public Button getButton()
    {
        return  button;
    }

}
Demo09

CustomView09

package bw.com.bw_day04.demo09;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Administrator on 2018/1/27.
 */

public class CustomView09 extends ViewGroup {

    public CustomView09(Context context) {
        super(context);
    }

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

    /**
     * 排版布局子控件的方法
     * @param changed
     * @param l     自己的左侧边距
     * @param t     自己的顶部边距
     * @param r     自己的右侧边距
     * @param b     自己的底部边距
     */
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        //1, 容器的宽度
        int selfWidth = r - l;//右侧 - 左侧

        //2, 得到当前容器中的子控件数量
        int count = getChildCount();

        //3, 声明子控件的初始值
        int cl = 10;
        int ct = 10;

        for(int i = 0;i<count;i++)
        {
            //4, 获取每一个自控件
            View childView = getChildAt(i);

            //5, 获取当前排版的子控件的右侧和底部
            int  cr = cl + childView.getMeasuredWidth();//childView.getMeasuredWidth() 测量后子控件的宽度 -- 测量方法中测量
            int  cb = ct + childView.getMeasuredHeight();

            if(cr>selfWidth)
            {
                cl = 10;
                ct = ct + 200;
                cr = cl + childView.getWidth();
                cb = ct + childView.getHeight();
            }

            //6, 排版
            childView.layout(cl,ct,cr,cb);
            cl = cr;
        }
    }

    //测量方法 -- 测量子控件
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        //子控件的测量
        measureChildren(widthMeasureSpec,heightMeasureSpec);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
CustomViewActivity09

package bw.com.bw_day04.demo09;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import bw.com.bw_day04.R;

public class CustomViewActivity09 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view09);
    }
}


布局

activity_custom_view01

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="bw.com.bw_day04.demo01.CustomViewActivity01">

    <!--自定义的使用,  必须要     包名.类名    -->
    <bw.com.bw_day04.demo01.CustomView01
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/cs_id"/>

</LinearLayout>
activity_custom_view02
   
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="bw.com.bw_day04.demo02.CustomViewActivity02">


    <bw.com.bw_day04.demo02.MyButton
        android:layout_width="350dp"
        android:layout_height="350dp"
        android:id="@+id/but_id"
        />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"
        />

    <bw.com.bw_day04.demo02.MyButton02
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:id="@+id/but_01_id"
        android:gravity="right|bottom"
        android:text="按钮"
        android:onClick="onClick"/>
</LinearLayout>
activity_custom_view03
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cs="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="bw.com.bw_day04.demo03.CustomViewActivity03">

    <!--如果想要为自定义的控件, 设置属性, 则需要自定义属性-->
    <bw.com.bw_day04.demo03.MyTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/mtv_id"
        cs:titleText="自定义属性的使用"
        cs:titleColor="@color/colorAccent"
        cs:titleSize = "30sp"
        />
</LinearLayout>
activity_custom_view04

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:background="@mipmap/background"
    tools:context="bw.com.bw_day04.demo04.CustomViewActivity04">

    <bw.com.bw_day04.demo04.MyEditText
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/met_id"/>
</LinearLayout>
activity_custom_view05

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="bw.com.bw_day04.demo05.CustomViewActivity05">

    <bw.com.bw_day04.demo05.CustomView05
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/cs_id"/>
</LinearLayout>
activity_custom_view06

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="bw.com.bw_day04.demo06.CustomViewActivity06">

    <bw.com.bw_day04.demo06.CustomView06
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/cs_id"/>
</LinearLayout>
activity_custom_view07

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="bw.com.bw_day04.demo07.CustomViewActivity07">

    <bw.com.bw_day04.demo07.CustomView07
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/cs_id"/>
</LinearLayout>
activity_custom_view08

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="bw.com.bw_day04.demo08.CustomViewActivity08">


    <bw.com.bw_day04.demo08.TitleView
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:id="@+id/title_view_id"
        />
</LinearLayout>
activity_custom_view09

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="bw.com.bw_day04.demo09.CustomViewActivity09">

    <bw.com.bw_day04.demo09.CustomView09
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮1"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮2"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮3"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮4"/>
        <Button
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:text="按钮5"/>

        <Button
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:text="按钮6"/>

        <Button
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:text="按钮7"/>

        <Button
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:text="按钮8"/>

    </bw.com.bw_day04.demo09.CustomView09>

</LinearLayout>
activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自定义View   方法介绍"
        android:id="@+id/but_01"
        android:onClick="onClick"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自定义View     监听"
        android:id="@+id/but_02"
        android:onClick="onClick"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自定义View   属性介绍"
        android:id="@+id/but_03"
        android:onClick="onClick"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="记事本"
        android:id="@+id/but_04"
        android:onClick="onClick"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="柱状图"
        android:id="@+id/but_05"
        android:onClick="onClick"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="饼图"
        android:id="@+id/but_06"
        android:onClick="onClick"/>


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="移动的圆"
        android:id="@+id/but_07"
        android:onClick="onClick"/>


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自定义组合控件"
        android:id="@+id/but_08"
        android:onClick="onClick"/>


    <!--Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自定义组合控件+自定义的属性"
        android:id="@+id/but_09"
        android:onClick="onClick"/-->


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="排版布局子控件"
        android:id="@+id/but_09"
        android:onClick="onClick"/>

</LinearLayout>
activity_main2
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="bw.com.bw_day04.demo08.Main2Activity">

    <bw.com.bw_day04.demo08.TitleView
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:id="@+id/title_view_id"
        />

</LinearLayout>
title_view

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"
        android:id="@+id/iv_id"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="当前的页面"
        android:layout_toRightOf="@id/iv_id"
        android:layout_margin="20dp"
        android:id="@+id/tv_id"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="返回"
        android:id="@+id/but_id"
        android:layout_alignParentRight="true"
        />

</RelativeLayout>
自定义View 的自定义属性

Values包下

attrs

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!--自定义View 的自定义属性-->
    <declare-styleable name="MyTextView">

        <attr name="titleText" format="reference|string"/>
        <attr name="titleColor" format="color|reference"/>
        <attr name="titleSize" format="reference|dimension"/>

    </declare-styleable>
</resources>
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值