android 音乐播放柱形图

直接上思路:

1: 先测量onMeasure 测量view的大小

2:绘制具体的柱形图onDraw;

其实我们的view可以wrap_content和固定值,如果是固定值就不用onMeasure了(仅限该需求下),但是如果是wrap_content的话 我们就需要重新测量大小了,因为我们需要用到wight和height。

wight = View.MeasureSpec.getSize(widthMeasureSpec);

height = View.MeasureSpec.getSize(heightMeasureSpec);

如果你感觉没思路的话,你也可以这个这样

实现步骤:

1:先做一个view 然后里面就画几个柱形图(静态的,到此成功了一半了!)

2:然后为什么会是动态的呢 ? 我们就会想到了利用开启一个线程,每次产生随机数randomNumber,然后根据随机数计算出柱形图的高height,最后刷新view。完了,就这。

这个view的模型如上图所示。

根据上图,我们可以知道:柱形图的数量比间隔数多一个。

我们要先测量获取wight 和 height

wight = View.MeasureSpec.getSize(widthMeasureSpec);

height = View.MeasureSpec.getSize(heightMeasureSpec);

然后我们看下变量

private float columnEarchWight ;//每一个柱子的宽度

private float difference;//每两个柱子之间的间隔

private int columnSize = 6;//总多少个柱子(默认是6个)

columnEarchWight = (float)(wight * 0.8/columnSize);

difference = (float)(wight * 0.2 / (columnSize - 1));

之所以0.8和0.2 的意思是:我们要所有的柱形图站宽度的0.8,间隔的宽度占总宽度的0.2;,然后再计算出每一个柱子的宽度和每一个间隔的宽度;

然后我们随机产生columnSize个整数

randomList.clear();

for(int i = 0;i < columnSize;i++){

//这是height分为columnSize - 1,然后随即产生 占几部分

nextInt = random.nextInt(columnSize - 1);

randomList.add(nextInt);

}

这些整数是每一个柱形图的高度所占height的比例(一个height共分为了columnSize - 1部分,然后nextInt 是占了几部分)

然后就是画图了

Paint paint = new Paint();

paint.setColor(Color.BLUE);

paint.setAntiAlias(true);

paint.setStyle(Paint.Style.FILL);

for(int i = 0;i < columnSize;i++){

RectF rectF1 =

new RectF(difference * i + columnEarchWight * i,

height * randomList.get(i)/(columnSize - 1),

(difference * i + columnEarchWight * (i + 1)),

height);

canvas.drawRect(rectF1,paint);

}

里面的for循环,对比上图,仔细琢磨一下。difference 是间隔,columnEarchWight 是宽度,

然后在写一个handler 每次都产生不同的随机数,然后刷新view。

完了 就这。

附上整体代码

package com.app.test.musicproject;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.RectF;

import android.os.Handler;

import android.os.Message;

import android.util.AttributeSet;

import android.util.Log;

import android.view.View;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

/**

* Created by liumengqiang on 2017/5/5.

*/

public class MusicView extends View {

public MusicView(Context context) {

super(context);

}

public MusicView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public MusicView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

private float height;

private float wight;

private List randomList = new ArrayList<>();

private Random random = new Random();//随机产生的数(柱子的高度)

private float columnEarchWight ;//每一个柱子的宽度

private float difference;//每两个柱子之间的间隔

private int columnSize = 6;//总多少个柱子(默认是6个)

public int getColumnSize() {

return columnSize;

}

public void setColumnSize(int columnSize) {

this.columnSize = columnSize;

columnEarchWight = (float)(wight * 0.8/columnSize);//所有柱子所占的宽度

difference = (float)(wight * 0.2 / (columnSize - 1));//所有柱子间隔宽度和

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

wight = View.MeasureSpec.getSize(widthMeasureSpec);

height = View.MeasureSpec.getSize(heightMeasureSpec);

columnEarchWight = (float)(wight * 0.8/columnSize);

difference = (float)(wight * 0.2 / (columnSize - 1));

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Paint paint = new Paint();

paint.setColor(Color.BLUE);

paint.setAntiAlias(true);

paint.setStyle(Paint.Style.FILL);

for(int i = 0;i < columnSize;i++){

RectF rectF1 =

new RectF(difference * i + columnEarchWight * i,

height * randomList.get(i)/(columnSize - 1),

(difference * i + columnEarchWight * (i + 1)),

height);

canvas.drawRect(rectF1,paint);

}

}

public void runView(){

new Thread(){

@Override

public void run() {

super.run();

try {

while(true){

sleep(100);

handler.sendEmptyMessage(1);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}.start();

}

private Handler handler = new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

int what = msg.what;

int nextInt;

switch (what){

case 1:{

randomList.clear();

for(int i = 0;i < columnSize;i++){

nextInt = random.nextInt(columnSize - 1);//这是height分为columnSize - 1,然后随即产生 占几部分

randomList.add(nextInt);

}

invalidate();

break;

}

}

}

};

}

android 音乐柱状图动画,android 音乐播放柱形图相关推荐

  1. android svg路径动画,Android和播放SVG动画

    把你的SVG图像,并将其转换为VectorDrawable here 您下载的XML文件添加到您的项目,看看它的外观.这里有一个VectorDrawable的一个例子的旋转和路径变形动画准备: and ...

  2. android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画

    android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透 ...

  3. android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制

    之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...

  4. android 自定义帧动画,Android 自定义方式实现帧动画效果

    前言 首先说下为啥要通过自定义处理的方式去实现Android的帧动画效果,因为通过系统原生支持的xml和java代码这两种方式实现,在播放的图片量很多时,会出现内存溢出,此现象也是在做项目当中有遇到, ...

  5. android局部翻转动画,android 围绕中心旋转动画

    本文主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 ...

  6. android studio实现动画,android studio上的基本动画实现(第一篇)

    hello,各位小伙伴们,在不少小伙伴们刚刚开始学习android的时候,经常会有一些project里面须要有一些基本动画的插入,那么具体是要怎么实现呢?咱们接下一块儿分析一下在android中的几种 ...

  7. android 实现冒泡动画,android 触摸事件冒泡动画效果

    原图魔法效果:(透明的有些看不清) PS之后加了背景色并放大后的效果 在屏幕中的效果(左上很小的那个,其他都是背景图): 中间很小的那个就是 先看动画实现代码explosion.xml(explosi ...

  8. android 创建帧动画,Android 逐帧动画创建实例详解

    Android 逐帧动画创建实例详解 前言: 我们看早期电影的时候,电影通常是一张一张播放,用我们现在专有名词来说,就是一帧帧来,安卓同样有这样动画效果的编排形式. 那么我们先定义逐帧动画xml文件 ...

  9. android dialog 消失动画,android 自定义dialog弹出和消失缩放动画

    本文转自:android 自定义dialog,窗口动画 Java代码: package com.sunxu.org.IndividualityDialog; import Android.app.Ac ...

  10. android 撒花动画,Android仿QQ聊天撒花特效 很真实

    先看看效果图吧 实现这样的效果,你要知道贝塞尔曲线,何谓贝塞尔曲线?先在这里打个问号 下面就直接写了 1.activity_main.xml xmlns:tools="http://sche ...

最新文章

  1. I/O模型之一:Unix的五种I/O模型
  2. McAfee ENS
  3. python调用电脑蜂鸣器一直响_电脑开机蜂鸣器一直响,9声滴~,什么问题?怎么处理?...
  4. Java Bean Validation 最佳实践
  5. SVN trunk branch tags 区别
  6. java求最后一位不为0的数字_【Java】 剑指offer(62) 圆圈中最后剩下的数字
  7. [0002] Hadoop HDFS cmd常用命令练手
  8. Element穿梭框Transfer与进度条组件绑定
  9. css中绝对定位和浮动的异同
  10. 近期流行手机病毒“手机骷髅”解决方案
  11. shell: 脚本获取ssh 端口号
  12. 传智播客黑马java 30期_黑马传智播客JavaEE57期 2019最新基础+就业+在职加薪_汇总...
  13. 程序员眼中的中国传统文化-王阳明《传习录》21
  14. WIN7,WIN10,WIN11怎么查看电脑操作系统位数
  15. HiCar目前支持的手机型号
  16. 2个鸡蛋,100层楼问题
  17. 一元运算符 + 表示正号 - 表示负号
  18. 【Android】Logcat使用
  19. 4000字干货长文!从校招和社招的角度说说如何准备大厂面试?
  20. 如何通过python自动化薅短视频APP羊毛

热门文章

  1. c 获取本地计算机ip,C++如何获取本机的IP地址
  2. Firefox火狐浏览器关闭更新提示
  3. GitHub · 如何创建文件夹
  4. python制作流动图_炫酷!用Python制作漂亮的流动桑基图
  5. html360全景图原理,通过HTML5 Canvas实现360度全景图
  6. 一点计算机电脑就闪,电脑启动有点闪烁是怎么回事
  7. 苹果换原装电池_手机资讯:iPhone 电池最大容量低于 80%换电池选原装还是第三方...
  8. 4000元组装电脑配置清单2021 4000元台式电脑组装配置单
  9. Win10防火墙放行MySQL3306端口
  10. 从网页浏览器跳转到微信打开公众号关注界面的解决方案