Android自定义View基础

时间:2023-03-10 07:12:24
Android自定义View基础

自定义控件, 视频教程

http://www.jikexueyuan.com/course/1748.html

1. 编写自定义view

2. 加入逻辑线程

3. 提取和封装自定义view

4. 利用xml中定义样式来影响显示效果

工程代码 Android自定义View基础DIYControls.zip

----------------------------------

1. 编写自定义view

定义MyView

public class MyView extends View {

    public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
} public MyView(Context context) {
super(context);
} @Override
protected void onDraw(Canvas canvas) {
// 加入绘制元素
Paint paint = new Paint();
paint.setTextSize(30);
canvas.drawText("hello carloz", 0, 30, paint); //默认左下对齐 }
}

在布局文件中使用,背景绿色

<com.carloz.diycontrols.MyView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"/>

运行效果

Android自定义View基础

绘制几何图形

canvas.drawLine(0, 60, 100, 60, paint);  //绘制直线

Rect r = new Rect(10, 90, 110, 190); //parm: int
canvas.drawRect(r, paint); // 绘制矩形 RectF rect = new RectF(10, 90, 110, 190); //parm: float
canvas.drawRect(rect, paint); // 绘制矩形

Android自定义View基础

绘制图片

public class MyView extends View {

    Bitmap bitmap;

    public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
} public MyView(Context context) {
super(context);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
} @Override
protected void onDraw(Canvas canvas) {
// 加入绘制元素
Paint paint = new Paint();
paint.setTextSize(30); canvas.drawText("hello carloz", 0, 30, paint); //默认左下对齐 RectF r = new RectF(10, 90, 110, 190); //parm: int
canvas.drawRoundRect(r, 10, 10, paint); // 绘制圆角矩形 paint.setColor(Color.RED); //改变图形颜色
canvas.drawCircle(60, 270, 50, paint); // 绘制圆, 圆心, 半径 paint.setStyle(Style.STROKE); //绘制空心的元素 canvas.drawBitmap(bitmap, 10, 350, paint); //画图
}
}

Android自定义View基础

充当ContentView,可以看到,layout文件中的背景色已经去掉了

public class MainActivity extends Activity {

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

aaarticlea/png;base64,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" alt="" />

2. 加入逻辑线程

目的:让绘制元素动起来

2.1 跑马灯效果的 文字

public class LogicView extends View {

    Paint paint = new Paint();
String text = "Carloz Logic View";
private float rx = 0;
MyThread thread; public LogicView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
} public LogicView(Context context) {
super(context);
// TODO Auto-generated constructor stub
} @Override
protected void onDraw(Canvas canvas) {
paint.setTextSize(30);
canvas.drawText(text, rx, 30, paint); if(thread == null ) {
thread = new MyThread();
thread.start();
}
} class MyThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true) {
rx += 5;
if (rx > getWidth()) //超出屏幕的时候让它返回来
rx = 0 - paint.measureText(text); postInvalidate(); //线程中更新绘制,重新调用onDraw方法
try {
Thread.sleep(50); //速度太快肉眼看不到,要睡眠
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

效果如下,

Android自定义View基础

2.2  扇形成圆

绘制颜色不断变化的圆

public class CircleView extends View {

    Paint paint = new Paint();
MyThread thread;
private RectF rectF = new RectF(30, 30, 100, 100);
private float sweepAngle = 0f; //区间角度 public CircleView(Context context, AttributeSet attrs) {
super(context, attrs);
} public CircleView(Context context) {
super(context);
} @Override
protected void onDraw(Canvas canvas) {
canvas.drawArc(rectF, 0, sweepAngle, true, paint);
//startAngle 起始角度, sweepAngle 区间角度, useCenter
if(thread == null ) {
thread = new MyThread();
thread.start();
}
} class MyThread extends Thread {
Random rand = new Random();
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true) {
sweepAngle += 2;
if (sweepAngle > 360) sweepAngle = 0; int r = rand.nextInt(256); //0~255
int g = rand.nextInt(256);
int b = rand.nextInt(256);
paint.setARGB(255, r, g, b); //透明度为0, 随时改变颜色
postInvalidate(); //线程中更新绘制,重新调用onDraw方法
try {
Thread.sleep(50); //速度太快肉眼看不到,要睡眠
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
<com.carloz.diycontrols.logicview.CircleView
android:layout_width="match_parent"
android:layout_height="match_parent" />

效果如下,

Android自定义View基础

3. 提取和封装自定义view

3.1 简化代码逻辑 -  将操作提取封装成抽象方法,让子类实现

3.2 如何禁止子类修改操作 - 在方法前添加final关键字,不允许子类覆盖

public abstract class BaseView extends View {

    Thread thread;

    public BaseView(Context context, AttributeSet attrs) {
super(context, attrs);
} public BaseView(Context context) {
super(context);
} @Override
final protected void onDraw(Canvas canvas) {
//禁止子类覆盖,用final
if(thread == null ) {
thread = new MyThread();
thread.start();
} else{
drawSub(canvas);
}
} protected abstract void logic();
protected abstract void drawSub(Canvas canvas); @Override
final protected void onDetachedFromWindow() {
// 离开屏幕时结束
//onDetachedFromWindow在销毁资源(既销毁view)之后调用
running = false;
super.onDetachedFromWindow();
}
private boolean running = true;
class MyThread extends Thread {
@Override
public void run() {
while(running) {
logic(); postInvalidate(); //线程中更新绘制,重新调用onDraw方法
try {
Thread.sleep(50); //速度太快肉眼看不到,要睡眠
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} }
public class LogicView extends BaseView{

    Paint paint = new Paint();
private RectF rectF = new RectF(30, 30, 100, 100);
private float sweepAngle = 0; //区间角度
Random rand = new Random(); public LogicView(Context context, AttributeSet attrs) {
super(context, attrs);
} public LogicView(Context context) {
super(context);
} @Override
protected void drawSub(Canvas canvas) {
canvas.drawArc(rectF, 0, sweepAngle, true, paint);
//startAngle 起始角度, sweepAngle 区间角度, useCenter
} @Override
protected void logic() {
sweepAngle += 2;
if (sweepAngle > 360) sweepAngle = 0; int r = rand.nextInt(256); //0~255
int g = rand.nextInt(256);
int b = rand.nextInt(256);
paint.setARGB(255, r, g, b); //透明度为0, 随时改变颜色
} }

运行如上代码可以看到,效果,与2是一样的

4. 利用xml中定义样式来控制显示效果

控制 文字行数,是否滚动

4.1 集成3中的BaseView定义控件 NumText,特别注意两个属性

private int lineNum = 0;
boolean xScroll = false; //在需要覆盖的方法中,使用属性控制 显示
@Override
protected void logic() {
if(xScroll) {
mx += 3;
if (mx > getWidth())
mx = 0- paint.measureText(text);
}
} @Override
protected void drawSub(Canvas canvas) {
for(int i=0; i< lineNum; i++){
int textSize = 30 + i;
paint.setTextSize(textSize);
canvas.drawText(text, mx, textSize*(1+i), paint);
}
}

4.2 在res/values/attrs.xml中定义 styleable

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="NumText">
<attr name="lineNum" format="integer" />
<attr name="xScroll" format="boolean" />
</declare-styleable> </resources>

4.3 在需要使用该 自定义控件 的布局文件中

* 定义命名空间

xmlns:carloz="http://schemas.android.com/apk/res/com.carloz.diycontrols"

· carloz 命名空间,随意

· http://schemas.android.com/apk/res/ 是固定的

· com.carloz.diycontrols是包名

* 使用属性

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:carloz="http://schemas.android.com/apk/res/com.carloz.diycontrols"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/container" > <com.carloz.diycontrols.v4.NumText
android:layout_width="match_parent"
android:layout_height="match_parent"
carloz:lineNum
="3"
carloz:xScroll
="false" /> </FrameLayout>

4.4 在控件的构造函数中 加载 被定义的属性

public NumText(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.NumText); //获取样式属性
lineNum = ta.getInt(R.styleable.NumText_lineNum, 1);
xScroll = ta.getBoolean(R.styleable.NumText_xScroll, false);
Log.i("ZXQ", "lineNum = " + lineNum);
ta.recycle(); //释放TypedArray
}

4.5 最终效果如下

Android自定义View基础

工程代码 Android自定义View基础DIYControls.zip

Android的粒子和动画效果系列课程