自定义控件, 视频教程

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

1. 编写自定义view

2. 加入逻辑线程

3. 提取和封装自定义view

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

工程代码 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"/>

运行效果

绘制几何图形

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); // 绘制矩形

绘制图片

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); //画图
}
}

充当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();
}
}
}
}
}

效果如下,

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" />

效果如下,

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 最终效果如下

工程代码 DIYControls.zip

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

Android自定义View基础的更多相关文章

  1. android 自定义view 前的基础知识

    本篇文章是自己自学自定义view前的准备,具体参考资料来自 Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了 ...

  2. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

  3. Android自定义View (二) 进阶

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24300125 继续自定义View之旅,前面已经介绍过一个自定义View的基础的例 ...

  4. Android 自定义View (二) 进阶

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24300125 继续自定义View之旅,前面已经介绍过一个自定义View的基础的例 ...

  5. Android自定义View(CustomCalendar-定制日历控件)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/54020386 本文出自:[openXu的博客] 目录: 1分析 2自定义属性 3onMeas ...

  6. Android自定义View(LineBreakLayout-自动换行的标签容器)

      最近一段时间比较忙,都没有时间更新博客,今天公司的事情忙完得空,继续为我的自定义控件系列博客添砖加瓦.本篇博客讲解的是标签自动换行的布局容器,正好前一阵子有个项目中需要,想了想没什么难度就自己弄了 ...

  7. 简单说说Android自定义view学习推荐的方式

    这几天比较受关注,挺开心的,嘿嘿. 这里给大家总结一下学习自定义view的一些技巧.  以后写自定义view可能不会写博客了,但是可以开源的我会把源码丢到github上我的地址:https://git ...

  8. Android 自定义 View 绘制

    在 Android 自定义View 里面,介绍了自定义的View的基本概念.同时在 Android 控件架构及View.ViewGroup的测量 里面介绍了 Android 的坐标系 View.Vie ...

  9. 【朝花夕拾】Android自定义View篇之(八)多点触控(上)MotionEvent简介

    前言 在前面的文章中,介绍了不少触摸相关的知识,但都是基于单点触控的,即一次只用一根手指.但是在实际使用App中,常常是多根手指同时操作,这就需要用到多点触控相关的知识了.多点触控是在Android2 ...

随机推荐

  1. MenuDrawer的使用

    ---恢复内容开始--- MenuDrawer框架是一个可以实现上下左右滑动的框架,在使用中可以在xml文件中配置也可以在java代码中实现效果的配置 可以以jar的形式或依赖的形式存在      用 ...

  2. 关于python写GUI桌面应用的一些研究结果

    研究了一下python开发GUI桌面应用的解决方案,研究结果记录如下: EasyGui:控件极为简单,连个基本的grid.list组件都没有,不适合商用,甚至是普通的应用都不行,放弃! Tkinter ...

  3. November 4th Week 45th Friday 2016

    Problems are not stop signs, they are guidelines. 问题不是休止符,而是指向标. Most of the problems can be overcom ...

  4. sqlserver 增加表字段

    ALTER TABLE [ImportCompanys]ADD shortName nvarchar(500)ADD ID int identity (1,1)

  5. android十六进制颜色代码转换为int类型数值

    android开发中将十六进制颜色代码转换为int类型数值方法:Color.parseColor("#00CCFF")返回int数值;

  6. 将.lib库文件转换成.a库文件的工具

    分享如下两个链接: 微盘: http://vdisk.weibo.com/s/ztzPTJIC52mz2 百度云盘: http://pan.baidu.com/s/11gTOc 使用方法,解压文件mi ...

  7. SDUT2608(Alice and Bob)

    题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynom ...

  8. 用.class文件创建对象

    第一步:  给你一个编译好的class文件以及它的包名,创建一个对象出来. 1)class文件源代码 package com.wsc.classloader; public class Tool{ p ...

  9. [AngualrJS + Webpack] Production Source Maps

    When you uglify your Angular code with Webpack's uglify plugin, debugging your application can be a ...

  10. android 32 Gallery:横着滚动的列表

    Gallery:横着滚动的列表 mainActivity.java package com.sxt.day05_01; import java.util.ArrayList; import java. ...