android实现音乐波动条形图

我们经常听音乐的时候都会有一些柱状图波动,今天我就在android里面来实现这个效果。先看效果图:

分析:

这里我将通过自定义view来实现这个效果,我们将重写View里面的两个重要的方法:onMeasure,onDraw。第一个方法是测量,第二个是绘制。因为我们的控件要适配屏幕,所以我们不能把大小写死了,所以要在
onMeasure里面动态设置大小。
Java
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//拿到控件的宽高度,并动态计算柱子的宽度
height = View.MeasureSpec.getSize(heightMeasureSpec);
width = View.MeasureSpec.getSize(widthMeasureSpec);
// Log.i("dandy",""+height+" "+width);
rect_w= (float) (width*0.9/6);//柱子的宽度,因为是6条柱子。*0.9是为了留有空隙,美观一点
random= (int) (height/5);//动态变换的高度比例
}

既然我们测量好了,就开始绘制吧,首先我们可以想象一下所以的条形图都是一样长的,想要他动起来,就得动态改变它的top值并且每隔一段时间刷新,这样就形成了波动效果。既然关键方法分析完了,那就直接上原代码。

public class MyView extends View  {private float width;//控件宽度private float height;//空间高度private float rect_w;//柱状图的宽度private int rect_t1,rect_t2,rect_t3,rect_t4,rect_t5;private int random;//动态变换的高度比例private boolean status=true;//控件的状态private Handler handler=new Handler(){    public void handleMessage(android.os.Message msg) {        if(msg.what==0x1233){            MyView.this.invalidate();//重绘更新view        }    };};public MyView(Context context) {    super(context);}public MyView(Context context, AttributeSet attrs) {    super(context, attrs);}/**这里是为了实现点击一下控件就停止 * 控制控件是否跳动  true为跳动,false为停止 * @param b */public void change_Status(boolean b){    status=b;}/**这里是为了实现点击一下控件就停止 * 拿到控件的状态 * @return */public boolean get_Status(){   // Log.i("smile","状态改变了吗?");    return status;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    //拿到控件的宽高度,并动态计算柱子的宽度    height = View.MeasureSpec.getSize(heightMeasureSpec);    width = View.MeasureSpec.getSize(widthMeasureSpec);   // Log.i("dandy",""+height+"   "+width);    rect_w= (float) (width*0.9/6);    random= (int) (height/5);}@Overrideprotected void onDraw(Canvas canvas) {    if(status==true){        // 定义一个定时器 ,让画图每个0.5秒执行一次        new Timer().schedule(new TimerTask() {            @Override            public void run() {                rect_t1=new Random().nextInt(random);                rect_t2=new Random().nextInt(random);                rect_t3=new Random().nextInt(random);                rect_t4=new Random().nextInt(random);                rect_t5=new Random().nextInt(random);                // TODO Auto-generated method stub                handler.sendEmptyMessage(0x1233);            }        }, 300);    }    else get_Status();    super.onDraw(canvas);    Paint paint=new Paint();    paint.setColor(Color.YELLOW);    paint.setStyle(Paint.Style.STROKE);    paint.setColor(Color.BLACK);    canvas.drawLine((float) (width*0.1), (float) (height*0.9), (float) (width*0.9), (float) (height*0.9), paint);    //画柱状;动态图,就要改变柱状的top值    RectF r1=new RectF((float) (width*0.1),rect_t1*5,(float)( width*0.1+rect_w),(float) (height*0.9));    RectF r2=new RectF((float) (width*0.1+rect_w),rect_t2*5,(float)( width*0.1+rect_w*2),(float) (height*0.9));    RectF r3=new RectF((float) (width*0.1+rect_w*2),rect_t3*5,(float)( width*0.1+rect_w*3),(float) (height*0.9));    RectF r4=new RectF((float) (width*0.1+rect_w*3),rect_t4*5,(float)( width*0.1+rect_w*4),(float) (height*0.9));    RectF r5=new RectF((float) (width*0.1+rect_w*4),rect_t5*5,(float)( width*0.1+rect_w*5),(float) (height*0.9));    Paint paint1=new Paint();    paint1.setColor(Color.YELLOW);    paint1.setStyle(Paint.Style.FILL);    paint1.setAntiAlias(true);    canvas.drawRect(r1,paint1);    canvas.drawRect(r2,paint1);    canvas.drawRect(r3,paint1);    canvas.drawRect(r4,paint1);    canvas.drawRect(r5,paint1);}}

最后直接在布局文件里面用这个View就行了。

更多相关文章

  1. Chronometer android计时器组件Chronometer的使用,android通话时
  2. Android上实现柱状图表 可实现边框矩形 没填充色
  3. Android的几种布局方式
  4. Android开发 第五课 Android的几种布局方式
  5. Android之布局属性重点
  6. Android的GridView控件点击图片变暗效果
  7. Android之打开和关闭软键盘
  8. android 图片圆角 遮罩_安卓圆角、背景遮罩。覆盖实现方式(适用于
  9. 源码解析Android中View的measure量算过程

随机推荐

  1. Android中如何获取视频文件的缩略图
  2. Android缩略图类源代码
  3. 八款开源Android游戏引擎
  4. android的抽屉控件SlidingDrawer的使用
  5. Android数据持久化之文件存储
  6. Android中操作SQLite数据库
  7. Android安装器(mac版) V1.0.0
  8. 创建和使用library
  9. [置顶] 如何使Android应用程序获取系统权
  10. Android(安卓)Studio 4.0 New Class 窗口