Android自定义View 画弧形,文字,并增加动画效果
一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧。
1.封装一个抽象的View类 BaseView.java
/**
* 封装基本View
* @author ansen
* @create time 2015-08-07
*/
public abstract class BaseView extends View{
private MyThread myThread; public BaseView(Context context, AttributeSet attrs) {
super(context, attrs);
} public BaseView(Context context) {
super(context);
} protected abstract void onDrawSub(Canvas canvas);//绘制图像
protected abstract void logic();//逻辑方法 子类实现 @Override
protected void onDraw(Canvas canvas) {
if(null==myThread){
myThread=new MyThread();
myThread.start();
}else{
onDrawSub(canvas);
}
} private boolean running=true;//控制循环 @Override
protected void onDetachedFromWindow() {
running=false;//销毁View的时候设置成false,退出无限循环
super.onDetachedFromWindow();
} //开启一个子线程绘制ui
private class MyThread extends Thread{
@Override
public void run() {
while(running){
logic();
postInvalidate();//重新绘制,会调用onDraw
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
2.在逻辑View类中实现自己想要绘制的内容 LogicView.java
1).集成BaseView,实现onDrawSub()跟logic()抽象方法
2).在onDraw()方法中绘制图形 例如:画弧形 画文字
3).onDrawSub()方法中实现绘制的逻辑
/**
* Android自定义View 画弧形,文字,并增加动画效果
* @author ansen
* @create time 2015-08-07
*/
public class LogicView extends BaseView{
private Paint paint;//画笔
private int x=0;
private RectF rectF=new RectF(150,150,380,380);
private int sweepAngle=0;//弧的结束度数
private Random random=new Random(); public LogicView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public LogicView(Context context) {
super(context);
init();
} //初始化画笔
private void init(){
paint=new Paint();
paint.setTextSize(60);
} @Override
protected final void onDrawSub(Canvas canvas) {
canvas.drawText("Hello World", x, 100, paint);
//第一个参数是RectF 左上的x y坐标 右下的x y坐标
//第二个参数是 弧形的开始角度
//第三个参数是 弧形的结束角度
//第四个参数是 true:画扇形 false:画弧线
//第五个参数是 画笔
canvas.drawArc(rectF, 0, sweepAngle, true, paint);
} @Override
protected void logic() {
x+=20;
sweepAngle+=3;//每次弧度加3 //随机设置画笔的颜色
int r=random.nextInt(255);
int g=random.nextInt(255);
int b=random.nextInt(255);
paint.setARGB(255, r, g, b); if(sweepAngle>=360){//如果弧度大于360° 从头开始
sweepAngle=0;
} if(x>getWidth()){//如果移动到屏幕外,从头开始
int textWidth=(int) paint.measureText("Hello World");//测量文字宽度
x=0-textWidth;
}
}
}
3.显示View的Activity MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new LogicView(this));
}
}
4.效果图如下:
Android自定义View 画弧形,文字,并增加动画效果的更多相关文章
- Android 自定义View 画圆 画线
自定义一个DrawCircle继承View 实现构造方法: public DrawCircle(Context context) { super(context); this.mContext = c ...
- Android自定义View实现仿QQ实现运动步数效果
效果图: 1.attrs.xml中 <declare-styleable name="QQStepView"> <attr name="outerCol ...
- 自定义view 之多个引导层动画效果
SupernatantView 如果我英文还可以的话这个应该叫做漂浮在上层的view---引导层 今天闲来无事看了网上的一些引导层案例总感觉如果不是很舒服,就是类似于很死板的显示和消失 我在想能不能弄 ...
- Android 自定义 View 绘制
在 Android 自定义View 里面,介绍了自定义的View的基本概念.同时在 Android 控件架构及View.ViewGroup的测量 里面介绍了 Android 的坐标系 View.Vie ...
- Android 自定义 view(三)—— onDraw 方法理解
前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...
- Android自定义View之CircleView
Android自定义View之CircleView 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/5999 ...
- [原] Android 自定义View步骤
例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能 ...
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
我们的手机通讯录一般都有这样的效果,如下图: OK,这种效果大家都见得多了,基本上所有的android手机通讯录都有这样的效果.那我们今天就来看看这个效果该怎么实现. 一.概述 1.页面功能分析 整体 ...
- Android自定义View实战(SlideTab-可滑动的选择器)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52178553 本文出自:[openXu的博客] 目录: 初步分析重写onDraw绘制 重写o ...
随机推荐
- 【ORACLE】 表空间信息
Linux 查看磁盘空间命令 格式: df -hl 显示格式为: 文件系统 容量 已用 可用 已用% 挂载点 [root@localhost opt]# dfFilesystem 1K-blo ...
- C#遍历DataSet中数据的几种方法总结
//多表多行多列的情况foreach (DataTable dt in YourDataset.Tables) //遍历所有的datatable{foreach (DataRow dr in dt.R ...
- web存储
1. cookie: 如果想将cookie取到,可以通过document.cookie;取到的是所有的cookie数据 他是一直保存在网页中的:他有一个时间的限制,如果时间过期,则删除 写入:docu ...
- WINFORM 输出txt文件
SaveFileDialog saveFile1 = new SaveFileDialog(); saveFile1.Filter = "文本文件(.txt)|*.txt"; sa ...
- jsp页面 如何通过el表达式获取request属性值
1. 我在一个超连接后加个参数如: http://localhost:8080/test/testjstl.jsp?pid=001 此时在jsp页面中,获取jsp传过来的pid的参数值 ...
- Maven 上传 jar包 到私服
登录Nexus后,点击右侧的“Repositories”,显示当前Nexus所管理的Repository, 默认情况下Nexus为我们创建了以下主要的Repository: 1.PublicRepos ...
- windows上面捕获声卡数据
转自:http://shanewfx.github.io/blog/2013/08/14/caprure-audio-on-windows/ 前一段时间接到一个任务,需要采集到声卡的输出信号,以便与麦 ...
- U盘安装Ubuntu 10.4 Server
试了几次的U盘安装Ubuntu Server失败后,只能求助网络了,找了半天终于安装成功了.问题就是虽然从U盘启动了安装程序,但是在系统安装到一半的过程中,会进行CD-ROM的检查,检查不到安装程序, ...
- 使用JDBC调用存储过程
DELIMITER $$ DROP PROCEDURE IF EXISTS `jdbc`.`addUser` $$ ),in birthday date,in money float,out pid ...
- CYQ.Data.Orm.DBFast 新增类介绍(含类的源码及新版本配置工具源码)
前言: 以下功能在国庆期就完成并提前发布了,但到今天才有时间写文介绍,主要是国庆后还是选择就职了,悲催的是上班的地方全公司都能上网,唯独开发部竟不让上网,是个局域网. 也不是全不能上,房间里有三台能上 ...