2019独角兽企业重金招聘Python工程师标准>>>

先看效果图:

下面我们将这个效果解剖一下, 我认为主要有三个难点:1. 歌词悬浮在所有页面之上2. 歌词可以拖动位置3. 歌词的播放效果 (颜色覆盖)对于第一点,首先想到的就是 WindowManager , 这个类可能不少人都用过, 一般用于获取屏幕宽度、高度,那么这次就要利用这个类来让我们的歌词永远置顶。

  WindowManager wm = (WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE);WindowManager.LayoutParams params = new WindowManager.LayoutParams();params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;params.width = WindowManager.LayoutParams.WRAP_CONTENT;params.height = WindowManager.LayoutParams.WRAP_CONTENT;TextView tv = new TextView(this);wm.addView(tv, params);

下面开始实现第二步: 歌词移动! 首先我们自定义一个TextView类:MyTextView, 该类继承自TextView, 并实现其中的onTouchEvent方法,来看一下代码:

  @Overridepublic boolean onTouchEvent(MotionEvent event) {//触摸点相对于屏幕左上角坐标x = event.getRawX();y = event.getRawY() - TOOL_BAR_HIGH;Log.d(TAG, "------X: "+ x +"------Y:" + y);switch(event.getAction()) {case MotionEvent.ACTION_DOWN:startX = event.getX();startY = event.getY();break;case MotionEvent.ACTION_MOVE:updatePosition();break;case MotionEvent.ACTION_UP:updatePosition();startX = startY = 0;break;}return true;}//更新浮动窗口位置参数private void updatePosition(){// View的当前位置params.x = (int)( x - startX);params.y = (int) (y - startY);wm.updateViewLayout(this, params);}

下面实现第三步: 歌词的播放效果。那么本例仅仅做一个循环, 实际音乐播放器要复杂些,需要根据歌剧的长度及时间间隔,来计算歌词的覆盖速度, 再根据这个速度来覆盖歌词,呈现给用户。要实现歌词播放的效果,需要用到画笔Paint, 还要用到Shader, 还有一个就是UI刷新的问题。一起来看下代码:

  @Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);float1 += 0.001f;float2 += 0.001f;if(float2 > 1.0){float1 = 0.0f;float2 = 0.01f;}this.setText("");float len = this.getTextSize() * text.length();Shader shader = new LinearGradient(0, 0, len, 0,new int[] { Color.YELLOW, Color.RED }, new float[]{float1, float2},TileMode.CLAMP);Paint p = new Paint();p.setShader(shader);// 下面这句才控制歌词大小p.setTextSize(20f);p.setTypeface(Typeface.DEFAULT_BOLD);//此处x,y坐标也要注意,尤其是y坐标,要与字体大小协调canvas.drawText(text, 0, 20, p);}

让他每隔3毫秒画一次, 就有了这个歌词播放的效果。

  private Runnable update = new Runnable() {public void run() {MyTextView.this.update();handler.postDelayed(update, 3);}};private void update(){postInvalidate();}

源代码:

转载:http://www.adobex.com/android/source/details/00000385.htm

转载于:https://my.oschina.net/androidcode/blog/104710

天天动听 悬浮歌词(迷你歌词)效果解读相关推荐

  1. [Android实例] 天天动听 悬浮歌词(迷你歌词)效果解读

    天天动听, 这款Android手机上的音乐播放器,相信不少朋友都曾用过. 不知大家是否注意到,天天动听有一个迷你歌词的特效. 什么效果呢? 就是不管你切到什么画面, 歌词永远显示,并且可以拖动. 类型 ...

  2. 【Android进阶】天天动听 悬浮歌词(迷你歌词)效果解读

    天天动听, 这款Android手机上的音乐播放器,相信不少朋友都曾用过. 不知大家是否注意到,天天动听有一个迷你歌词的特效. 什么效果呢? 就是不管你切到什么画面, 歌词永远显示,并且可以拖动. 类型 ...

  3. android歌词效果,Android 天天动听 悬浮歌词(迷你歌词)效果解读

    天天动听, 这款Android手机上的音乐播放器,相信不少朋友都曾用过. 不知大家是否注意到,天天动听有一个迷你歌词的特效.什么效果呢? 就是不管你切到什么画面, 歌词永远显示,并且可以拖动. 类型Q ...

  4. 【Android进阶】天天动听 悬浮歌词 迷你歌词 效果解读

    天天动听, 这款Android手机上的音乐播放器,相信不少朋友都曾用过. 不知大家是否注意到,天天动听有一个迷你歌词的特效. 什么效果呢? 就是不管你切到什么画面, 歌词永远显示,并且可以拖动. 类型 ...

  5. 【Android-悬浮窗】天天动听 悬浮歌词(迷你歌词)效果解读

    天天动听, 这款Android手机上的音乐播放器,相信不少朋友都曾用过. 不知大家是否注意到,天天动听有一个迷你歌词的特效. 什么效果呢? 就是不管你切到什么画面, 歌词永远显示,并且可以拖动. 类型 ...

  6. Android 天天动听 悬浮歌词(迷你歌词)效果解读

    转自:http://mobile.51cto.com/android-266613.htm 天天动听, 这款Android手机上的音乐播放器,相信不少朋友都曾用过. 不知大家是否注意到,天天动听有一个 ...

  7. 【Android进阶】天天动听 悬浮歌词

    [Android进阶]天天动听 悬浮歌词(迷你歌词)效果解读 天天动听, 这款Android手机上的音乐播放器,相信不少朋友都曾用过. 不知大家是否注意到,天天动听有一个迷你歌词的特效. 什么效果呢? ...

  8. 天天动听悬浮歌词实现

    2019独角兽企业重金招聘Python工程师标准>>> 天天动听, 这款Android手机上的音乐播放器,相信不少朋友都曾用过. 不知大家是否注意到,天天动听有一个迷你歌词的特效. ...

  9. Android 悬浮歌词(迷你歌词)效果解读 (转)

    先来看一下效果. 这个歌词是在所有界面之上的. 下面我们将这个效果解剖一下, 我认为主要有三个难点: 1.  歌词悬浮在所有页面之上 2.  歌词可以拖动位置 3.  歌词的播放效果 (颜色覆盖) 对 ...

最新文章

  1. 为了你的幸福,你知道细菌有多努力吗?
  2. window.onload和jquery中$(function(){ })的区别
  3. IBatis初体验2
  4. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 25丨求团队人数【难度中等】​
  5. “n个球放入m个盒子是否为空”的方案数
  6. Extjs EditorGridPanel
  7. 【微信页面】移动端微信页面禁止字体放大
  8. 知识图谱+Recorder︱中文知识图谱API与工具、科研机构与算法框架
  9. 各银行支付/各种支付平台/php对接支付接口心得/php h5支付接口对接
  10. 贝叶斯信念网络简介以及算法整理笔记
  11. 数学与计算机学院女生节标语,女生节标语理学院
  12. 固件-驱动-软件 区别
  13. ZYNQ产品生产拷机问题思考
  14. “外卖式”售后服务体验来袭 沃丰科技ServiceGo让售后服务更智能
  15. 一张图看懂华为2019年关键业务进展
  16. UOJ#311. 【UNR #2】积劳成疾 动态规划
  17. win10 LATEX 安装使用 支持前向 后向 (TeX Live 2021+VSCode【不需要额外下载PDF阅览器,不需要跟换任何路径】)
  18. Unable to create tempDir, java.io.tmpdir no space left on device
  19. SPSS(Statistical Product and Service Solutions)安装
  20. 不灭之魂php大马,不灭的勇者魂 haru 评《[猎人]旷野之息又更新了一个DLC》 时间:2019-05-26 10:35:07...

热门文章

  1. 微服务架构的优势与不足
  2. linux下vsftp
  3. mysql中文无法显示
  4. 用CSS实现梯形图标
  5. 2018.12.24
  6. Java 高级算法——数组中查询重复的数字
  7. .NET 动态向Word文档添加数据
  8. System.exit(0)和System.exit(1)区别
  9. 干货分享|安全测试起航之旅
  10. (三)spark集群DHCP IP变化后的处理