结构:

BaseView:

package com.caiduping.canvas;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View; 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); //线程挂起0.2秒 即画弧速度为0.2秒/弧度
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

LogicView:

package com.caiduping.canvas;

import java.util.Random;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet; public class LogicView extends BaseView{
private Paint paint;//画笔
private int x=0;
private RectF rectF=new RectF(150,150,380,380);
/*Rect类主要用于表示坐标系中的一块矩形区域
* 并可以对其做一些简单操作。这块矩形区域
需要用左上右下两个坐标点表示(left,top,right,bottom)
如果你这么声明一个Rect类:
Rect rect=new Rect(100,50,300,500);
那么右下角(300,500)其实是不在这个矩形里面的,但是左上角(100,50)在
也就是说,这个矩形实际表示的区域是:(100,50,299,499)*/
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(30);
} @Override
protected final void onDrawSub(Canvas canvas) {
canvas.drawText("Android之自定义画图文字动画", x, 100, paint);
/*第一个参数是RectF左上的x y坐标 右下的x y坐标
第二个参数是 弧形的开始角度
第三个参数是 弧形的结束角度
第四个参数是 true:画扇形 false:画弧线
第五个参数是 画笔 */
canvas.drawArc(rectF, 0, sweepAngle, true, paint);
} @Override
protected void logic() {
x+=20;
sweepAngle+=5;//每次弧度加5 //随机设置画笔的颜色
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("Android之自定义画图文字动画");//测量文字宽度
x=0-textWidth;
}
}
}

MainActivity:

setContentView(new LogicView(this));

run:

Android之自定义画图文字动画的更多相关文章

  1. Android实现自定义带文字和图片的Button

    Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...

  2. android checkbox自定义(文字位置、格式等)

    第一种:在原生中只调整显示位置等: <CheckBox android:id="@+id/checkBox8" android:layout_width="wrap ...

  3. 【Android】Android实现自定义带文字和图片的Button

    在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最 ...

  4. Android PullToRrefresh 自定义下拉刷新动画 (listview、scrollview等)

    PullToRefreshScrollView 自定义下拉刷新动画,只需改一处. 以下部分转载自http://blog.csdn.net/superjunjin/article/details/450 ...

  5. [转]Android UI:看看Google官方自定义带旋转动画的ImageView-----RotateImageView怎么写(附 图片淡入淡出效果)

    http://blog.csdn.net/yanzi1225627/article/details/22439119 众所周知,想要让ImageView旋转的话,可以用setRotation()让其围 ...

  6. [置顶] android 自定义ListView实现动画特效

    通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...

  7. Android自己定义组件系列【8】——面膜文字动画

    我们掩盖文字动画Flash中非经货共同体共同,由于Android应用程序开发人员做你想要做这个动画在应用程序中去?本文中,我们看的是如何自己的定义ImageView来实现让一张文字图片实现文字的遮罩闪 ...

  8. Android自定义底部带有动画的Dialog

    Android自定义底部带有动画的Dialog 效果图 先看效果图,是不是你想要的呢 自定义Dialog package --.view; import android.app.Dialog; imp ...

  9. Android UI:看看Google官方自定义带旋转动画的ImageView-----RotateImageView怎么写(附 图片淡入淡...)

    众所周知,想要让ImageView旋转的话,可以用setRotation()让其围绕中心点旋转,但这个旋转是不带动画的,也就是旋转屏幕时图片噌的一下就转过去了,看不到旋转的过程,此UI体验不大好,为此 ...

随机推荐

  1. Centos7安装Docker Engine

    一.先决条件 首选需要一个64位操作系统和3.10或者更版本的内核. 查看当前内核版本: $ uname -r -.el7.x86_64 二.yum安装Docker Engine 安装Docker E ...

  2. DATE_FORMAT() 函数

    DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据DATE_FORMAT(now(),'%Y-%m-%d %T')

  3. 教你50招提升ASP.NET性能(十八):在处理网站性能问题前,首先验证问题是否出在客户端

    (29)Before tackling any website performance issue, first verify the problem isn’t on the client 招数29 ...

  4. PostgreSQL的schema信息,存储于何处

    查看schema信息: [pgsql@localhost bin]$ ./psql psql () Type "help" for help. pgsql=# create sch ...

  5. 创建动态组-以OU为单位

    选择“Windows 计算机”为对象,因为监视对象是以计算机为单位 ==================== 以下方式则无组成员返回: 此时要求返回的对象为AD用户或组,猜测SCOM没有监视到该用户或 ...

  6. 通过SCVMM分配SMB 3.0 文件共享

    1.创建SMB群集共享,赋予Hyper-V主机. Hyper-V群集名称.Hyper-V管理员.Hyper-V服务账户完全控制权限 2.VMM提供程序导入 文件服务器(运行方式账户要对文件服务器群集的 ...

  7. hibernate-mapping的各种属性配置

    先给出一份常见的持久化类配置文件大概熟悉一下 <strong><spanstyle="font-size: 18px;"><hibernate-map ...

  8. 微设计(www.weidesigner.com)介绍系列文章(一)

    1.1 什么是微设计? 微设计(www.weidesigner.com)是一个专门针对微信公众账号提供营销推广服务而打造的第三方平台.主要功能是针对微信商家公众号提供与众不同的.有针对性的营销推广服务 ...

  9. VS2012开发ActiveX插件 尝试1

    今天闲来无聊研究了下 ActiveX插件开发,以前一直以为很牛逼,然后发现还是比较简单的东西.. 首先: 在开始前 准备好 VS12开发工具,cabarc.exe 工具(注:这是 用来 将文件打包成c ...

  10. C语言用static限制函数以及全局变量的作用域

    今天才发现这个东西! C语言中没有public private之类的东西. 如果一个函数或者一个全局变量只想在一个.c文件中使用,可以在前面加上static! 以前我还傻傻的每个.c文件中的函数都加一 ...