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>