Chart 绘制,自带动画效果
package com.example.canvasdemo; import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation; public class ChartView extends View{ @SuppressLint("NewApi")
public ChartView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initData();
} public ChartView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
} public ChartView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public ChartView(Context context) {
this(context, null);
} public void initData(){
mPaints = new Paint[mChartNum];
//--初始化需要的画笔
for (int i = 0; i < mPaints.length; i++) {
mPaints[i] = new Paint();
mPaints[i].setAntiAlias(true);
mPaints[i].setDither(true);
mPaints[i].setStyle(Paint.Style.FILL);
mPaints[i].setColor(0x880FF000 + i * 0x019e8860);
mPaints[i].setTextSize(30);
} initAnim();
} /**
* 初始化自定义动画
*/
private void initAnim(){
anim = new ChartAnim();
anim.setDuration(2000);
} /**
* 直方图的数目
*/
private int mChartNum = 8;
private Paint[] mPaints; /**
* 直方图的宽度
*/
private int mChartW = 80; //--间隔
private int mInterval = 20; @SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//--绘制背景色
canvas.drawColor(Color.TRANSPARENT);
canvas.save();
canvas.translate(100, 0);
//--绘制直方图
for (int i = 0; i < mPaints.length; i++) {
canvas.drawRect(new Rect(mChartW*i + mInterval*(i+1),(int)(mH/2 - mmLs[i] * percent),mChartW*(i+1) + mInterval*i,mH/2), mPaints[i]);
} //--绘制文本
for(int i = 0; i < mmLs.length; i ++){
int textw = (int) mPaints[i].measureText(mmLs[i]+"");
FontMetrics mfontm = mPaints[i].getFontMetrics();
int texth = (int) (mfontm.descent - mfontm.ascent);
int textT = (mChartW*(i+1) + mInterval*i) - (mChartW*i + mInterval*(i+1));
int temp = (textT - textw)/2;
canvas.drawText(mmLs[i]+"",temp + mChartW*i + mInterval*(i+1), mH/2 + texth + mInterval, mPaints[i]);
}
//--底部分割线的绘制
Paint mPaint = new Paint();
mPaint.setDither(true);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(3);
// int rNum = (int) (Math.random()*mmLs.length);
mPaint.setColor(0x880FF000 + 2*0x019e8860);
canvas.drawLine(0, mH/2 , (mChartW + mInterval)*mChartNum, mH/2 , mPaint);
canvas.restore();
} private float percent = 0;
private int mW;
private int mH;
private int[] mmLs;
private ChartAnim anim;
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
this.mW = w;
this.mH = h; initChartData();
} private void initChartData(){
mmLs = new int[mChartNum];
for(int i =0 ;i < mmLs.length; i++){
mmLs[i] = (int)(Math.random()*mH/2);
Log.d("TAG","initData = " + mmLs[i]);
}
} public void startAnim(){
this.startAnimation(anim);
} private class ChartAnim extends Animation{ /**
* 每次系统调用这个方法时, 改变percent的值,
* 然后调用postInvalidate()不停的绘制view。
*/
@Override
protected void applyTransformation(float interpolatedTime,
Transformation t) {
super.applyTransformation(interpolatedTime, t);
percent = interpolatedTime;
postInvalidate();
}
} public void reset(){
initChartData();
}
}
上述中关键处代码解释已经添加
辣么接下来就是直接效果图:

Chart 绘制,自带动画效果的更多相关文章
- android标题栏下面弹出提示框(一) TextView实现,带动画效果
产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...
- 神奇的canvas——点与线绘制的绚丽动画效果
代码地址如下:http://www.demodashi.com/demo/11636.html 前言 之前在某网站上看到了一个canvas绘制的动画效果,虽然组成的元素很简单,只有点和线,但是视觉效果 ...
- android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果
需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果, 总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...
- 纯CSS3带动画效果导航菜单
随着互联网的发展,网页能表现的东西越来越多.由最开始单纯的文字和链接构成的网页,到后来的表格布局,再到div+css模式,现在发展到了html+css3.网页能表达的东西越来越多,css3兴起已经很多 ...
- 收藏一个带动画效果的ScrollViewer以及ScrollBar的模板
这里介绍一个带动画效果的ScrollViewer和ScrollBar,总共分为两个资源字典,直接拿来引用即可: 1 ScrollBarStyle.xaml <ResourceDictionary ...
- Android利用温度传感器实现带动画效果的电子温度计
概述 Android利用温度传感器实现带动画效果的电子温度计. 详细 代码下载:http://www.demodashi.com/demo/10631.html 一.准备工作 需要准备一部带有温度传感 ...
- 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计
要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...
- /*带动画效果的hover*/
<!DOCTYPE html> /*带动画效果的hover*/ <html lang="en"> <head> <meta charset ...
- 带动画效果的jQuery手风琴
带动画效果的jQuery特效手风琴是一款带动画效果的手风琴作品,非常实用,可以用在新闻列表.FAQ等模块,默认的是打开第一个选项,查看其它的时候直接点击加号按钮就展开. 源码地址:http://www ...
- jquery插件——点击交换元素位置(带动画效果)
一.需求的诞生 在我们的网页或者web应用中,想要对列表中的元素进行位置调整(或者说排序)是一个常见的需求.实现方式大概就以下两种,一种是带有类似“上移”.“下移”的按钮,点击可与相邻元素交换位置,另 ...
随机推荐
- SDL实战,小游戏
http://www.cppblog.com/sandy/archive/2005/12/28/2219.html sdl1教学 http://kelvmiao.info/sdl-tutorial-c ...
- Ajax注册验证js代码
分享jquery网站:http://www.css88.com/jqapi-1.9/focusout/ $(document).ready(function() { var bool_user = f ...
- DropDownList 控件不能触发SelectedIndexChanged 事件
相信DropDownList 控件不能触发SelectedIndexChanged 事件已经不是什么新鲜事情了,原因也无外乎以下几种: 1.DropDownList 控件的属性 AutoPostBac ...
- 分模块创建maven项目(二)
1.新建Parent项目,MavenProject 2.新建子模块项目,MavenProject 右击项目名 --> NEW --> other 结果,在parent上运行会打出两个包,一 ...
- Setting start page of Windows Phone dynamically through code
Essentially this one line of code will set the start page of the application. var navTo = new Uri(&q ...
- C# empty private constructor
A private constructor is a special instance constructor. It is generally used in classes that contai ...
- [CareerCup] 17.7 English Phrase Describe Integer 英文单词表示数字
17.7 Given any integer, print an English phrase that describes the integer (e.g., "One Thousand ...
- Pixar Shorts 皮克斯动画短片全集
[原创短片](Theatrical Shorts)16部 <安德鲁和威利冒险记><顽皮跳跳灯><红色的梦><锡铁小兵><小雪人大行动>< ...
- 重写(Override)与重载(Overload)
重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类 ...
- PHP如何关闭notice级别的错误提示
1.在php.ini文件中改动error_reporting改为:error_reporting=E_ALL & ~E_NOTICE2.如果你不能操作php.ini文件,你可以使用如下方法在你 ...