音乐播放时跳动的音符
2016-12-08 15:00
337 查看
package com.ble.gsense.rbq.view; /** * Created by rbq on 2016/12/8. */ import java.util.Random; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.View; import com.ble.gsense.rbq.R; public class MusicPlayBarView extends View { private byte[] mBytes; private Rect mRect = new Rect(); private Paint mForePaint = new Paint(); //添加这个标志的原因是用于判断当前是否进入循环了。如果没有则在onDraw()方法的时候进入。为什么需要这样呢。原因是RecyclerView的一个资源节约的机制来的,在item不在页面显示中的时候就会销毁掉这个View,导致无法在重新进入的时候跳动。然后就是有的时候他不会销毁,但是会暂停住整个状态,就是这个item处于第一个超出界面的item时不会销毁(个人猜测没看源码)。所以导致了滑动RecyclerView回来之后不会跳动的问题。所以添加这个用于解决此问题。 private AtomicBoolean mInHandlerFlag=new AtomicBoolean(false); public MusicPlayBarView (Context context) { super(context); init(); } public MusicPlayBarView (Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public MusicPlayBarView (Context context, AttributeSet attrs) { super(context, attrs); init(); } public boolean isShow() { return super.isShown(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); mInHandlerFlag.set(false); } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (!MusicPlayBarView .this.isShown()) return; mHandler.removeMessages(0); mInHandlerFlag.set(true); Random random = new Random(); byte[] bytes = getBytes(987); bytes = getBytes(random.nextInt()); if (isShow.get()) { mHandler.sendEmptyMessageDelayed(0, 100); } updateVisualizer(bytes); } }; public void show() { if (!isShow.get()) { isShow.set(true); mHandler.sendEmptyMessage(0); } } public void hide() { isShow.set(false); mHandler.sendEmptyMessage(0); } private AtomicBoolean isShow = new AtomicBoolean(false); private byte[] getBytes(int data) { byte[] bytes = new byte[4]; bytes[0] = (byte) (data & 0xff); bytes[1] = (byte) ((data & 0xff00) >> 8); bytes[2] = (byte) ((data & 0xff0000) >> 16); bytes[3] = (byte) ((data & 0xff000000) >> 24); return bytes; } public static byte[] getBytes(long data) { byte[] bytes = new byte[8]; bytes[0] = (byte) (data & 0xff); bytes[1] = (byte) ((data >> 8) & 0xff); bytes[2] = (byte) ((data >> 16) & 0xff); bytes[3] = (byte) ((data >> 24) & 0xff); bytes[4] = (byte) ((data >> 32) & 0xff); bytes[5] = (byte) ((data >> 40) & 0xff); bytes[6] = (byte) ((data >> 48) & 0xff); bytes[7] = (byte) ((data >> 56) & 0xff); return bytes; } public byte[] getBytes(float data) { int intBits = Float.floatToIntBits(data); return getBytes(intBits); } public byte[] getBytes(double data) { long intBits = Double.doubleToLongBits(data); return getBytes(intBits); } private void init() { mBytes = null; mForePaint.setStrokeWidth(1f); mForePaint.setAntiAlias(true); mForePaint.setColor(Color.rgb(0, 143, 229)); } public void updateVisualizer(byte[] bytes) { byte[] model = new byte[bytes.length]; for (int i = 0; i < bytes.length - 1; i++) { model[i] = bytes[i]; } mBytes = bytes; invalidate(); } private void drawRect(float left, float width, float top, Canvas canvas) { final float right = left + width; final float bottom = getHeight(); final float thickness = 3.0f; float currenttop = bottom; while (true) { canvas.drawRect(left, currenttop - thickness, right, currenttop, mForePaint); currenttop -= thickness; if (currenttop <= top) break; } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(isShow.get()&&!mInHandlerFlag.get()){ mHandler.sendEmptyMessage(0); return; } if (mBytes == null) { return; } int sum = 0; for (int i = 0; i < mBytes.length; i++) sum += mBytes[i]; if (sum == 0) return; mRect.set(0, 0, getWidth(), getHeight()); int length = mBytes.length; final float width = getResources().getDimensionPixelSize( R.dimen.music_play_animation_width);// play bar width final float blankWidth = getResources().getDimensionPixelSize( R.dimen.music_play_animation_blank_area_width);// blank area width final float lastOffSet = width + blankWidth; float left, top; for (int i = 0; i < length; i++) { left = lastOffSet * i;// every play bar start x position. top = mRect.height() / 2 + ((byte) mBytes[i]) * (mRect.height() / 2) / 128; drawRect(left, width, top, canvas); } } }
相关文章推荐
- 音乐播放时跳动的音符
- 【html5 audio】音乐播放,灵动的音符效果 分类: HTML5 audio 播放音乐 效果 2014-12-31 15:45 422人阅读 评论(0) 收藏
- Android播放音乐时跳动的屏谱demo
- 【html5 audio】音乐播放,灵动的音符效果
- Linux环境下C语言编写的播放音乐的例子
- swift下实现网络音乐下载与播放(最通俗易懂源代码)
- win mobile 5播放mp3音乐的方法(2)--libmad库的使用篇
- HTML中播放音乐
- 锁屏下控制音乐播放 懒人自有妙招
- Android音乐播放器---实现Notification控制音乐播放
- ios音乐后台播放
- 【技法操作】UI界面设计,用PS绘制音乐播放页面教程
- 基本音乐播放与音乐播放池
- Android服务使用方法 - 简单音乐播放实例
- cocos2d-x 入门 如何播放音乐和音效
- ArchLinux 音乐播放客户端ncmpcpp和服务端mpd的配置
- 用DirectX Audio和DirectShow播放声音和音乐(6)
- android 遍历根目录获取音乐文件从听筒播放 延迟播放
- 易语言播放指定的音乐文件
- 51单片机 使用蜂鸣器播放简单音乐