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 ...
随机推荐
- javascript的变量声明提升
这篇随笔是对网上文章的整理吸收 1. javascript的作用域是函数,不是块 2. 在函数内部,javascript解释器会把var变量提升到当前域的最前面,但是函数体不会提升. 看下面例子: v ...
- Java Hashtable的实现
先附源码: package java.util; import java.io.*; /** * This class implements a hash table, which maps keys ...
- HTML5新标签<canvas>
基本用法 首先在body中写个<canvas>,设定大小,个人建议大小要在行内设置,不然在部分情况下会发生错误. CSS部分 给canvas加个边框,这边框只是为了方便看出canvas的边 ...
- hoj 1014 Niven Numbers
新手上路之我的水题之路 刚开始时,我首先想到的是定义一个int数组,然后让输入的数字从最低位开始在循环不断地*base,从而将 k进制转化成十进制:然后再作取模判断就可以了: 这时在将最低位到最高位依 ...
- Think in 递归
网上写递归的文章可以用汗牛充栋来形容了,大多数都非常清晰而又细致的角度上讲解了递归的概念,原理等等.以前学生的时候,递归可以说一直是我的某种死穴,原理,细节我都懂,但是不管是在如何运用或者如何试试算法 ...
- 报文解析及CRC类
/// <summary> /// 报文解析转换类 /// </summary> public class DatagramConvert { public static En ...
- ListView.setAdapter(adapter);空指针异常的解决的总结
报空指针异常一般的情况: 1,没有找到布局文件的ID 检验是不是id重复或者写错了 2.控件没有实例化 3.没有找到布局文件的id,要看看是不是加载了布局了,必须加载了对应的布局才能找到对应布局下的 ...
- Android ANR 分析解决方法
一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) ...
- 玩转Asp.net MVC 的八个扩展点
MVC模型以低耦合.可重用.可维护性高等众多优点已逐渐代替了WebForm模型.能够灵活使用MVC提供的扩展点可以达到事半功倍的效果,另一方面Asp.net MVC优秀的设计和高质量的代码也值得我们去 ...
- Python黑帽编程2.1 Python编程哲学
Python黑帽编程2.1 Python编程哲学 本节的内容有些趣味性,涉及到很多人为什么会选择Python,为什么会喜欢这门语言.我带大家膜拜下Python作者的Python之禅,然后再来了解下P ...