Android UI之自定义——最简单的仿QQ音乐歌词颜色渐变

Android UI之自定义——最简单的仿QQ音乐歌词颜色渐变

记得刚开始做android的时候,就发现QQ音乐歌词颜色渐变的效果,就在网上搜索过,但是就是没有找到满意的。今天突然用QQ音乐听歌的时候,看到歌词颜色渐变,决定来分析看看,没想到实现原来如此简单。这篇只是将最简单的歌词颜色渐变功能,不包括歌词滚动等效果。


首先来看下QQ音乐歌词界面


实现步骤

从界面上可以看出,是通过不同颜色的文本叠加所形成的视觉效果。那么android文本一般使用TextView实现,那就来试试用TextView在layout中实现。

  1. Layout尝试

    需要一个比较长的TextView和一个短的TextView

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="最简单的仿QQ音乐歌词颜色渐变"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="#726463" />
    
        <TextView
            android:layout_width="40dp"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="最简单的仿QQ音乐歌词颜色渐变"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="#39DF7C" />
    </RelativeLayout>
    
    

    上面一个确实是一个长点的TextView和一个短点的TextView,效果如下

    按照设置40dp的width,应该显示2个字才对。所以失败

接下来修改layout,关键属性android:ellipsize,当设置这个属性为none,如下

 <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="最简单的仿QQ音乐歌词颜色渐变"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="#726463" />

        <TextView
            android:layout_width="40dp"
            android:layout_height="wrap_content"
            android:ellipsize="none"
            android:singleLine="true"
            android:text="最简单的仿QQ音乐歌词颜色渐变"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="#39DF7C" />
    </RelativeLayout>

效果图如下:

貌似好像成功了,接下来看下面封装LRCTextView

2. LRCTextView封装

直接上代码

package com.example.qqmusiclrc.view;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

@SuppressLint("NewApi")
public class LRCTextView extends RelativeLayout {
    private TextView tvDefault;
    private TextView tvSelect;
    private String lrc = "我是测试歌词 我是测试歌词 我是测试歌词";

    /**
     * 设置歌词
     *
     * @param lrc
     */
    public void setLrc(String lrc) {
        this.lrc = lrc;
        tvDefault.setText(lrc);
        tvSelect.setText(lrc);
    }

    public LRCTextView(Context context, AttributeSet attrs, int defStyleAttr,
            int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    public LRCTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public LRCTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LRCTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        tvDefault = new TextView(getContext());
        tvDefault.setText(lrc);
        tvDefault.setTextColor(Color.parseColor("#726463"));
        tvDefault.setEllipsize(null);
        tvDefault.setSingleLine();
        tvDefault.setTextSize(16);

        tvSelect = new TextView(getContext());
        tvSelect.setTextColor(Color.parseColor("#39DF7C"));
        tvSelect.setText(lrc);
        tvSelect.setEllipsize(null);
        tvSelect.setSingleLine();
        tvSelect.setTextSize(16);
        addView(tvDefault);
        addView(tvSelect);
        tvSelect.setWidth(0);
    }

    @Override
    protected void onWindowVisibilityChanged(int visibility) {
        super.onWindowVisibilityChanged(visibility);
        if (visibility == View.VISIBLE) {
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    setPercent(percent);
                }
            }, 10);
        }
    }

    private float percent;

    /**
     * 设置颜色渐变百分比
     *
     * @param percent
     */
    public void setPercent(float percent) {
        this.percent = percent;
        setSelectWidth((int) (getSelectWidth() * percent));
    }

    private int getSelectWidth() {
        return tvDefault.getWidth();
    }

    private void setSelectWidth(int pixels) {
        if (pixels <= getSelectWidth()) {
            tvSelect.setWidth(pixels);
        }
    }
}

代码很简单,我就不多说啥了。

最后

上传demo,点击这里下载(后续补上,csdn还没审核通过,很奇怪。现在需要代码的请留下邮箱)

时间: 2024-11-01 21:29:53

Android UI之自定义——最简单的仿QQ音乐歌词颜色渐变的相关文章

wpf 仿QQ音乐歌词卡拉OK

最近用WPF做了个音乐播放器,读取歌词.歌词同步都已经实现了.卡拉OK逐字变色 也实现了,但是逐字变色时不能根据歌手唱的快慢来逐字显示.请问各位大神,这个如何解决,有何思路?(附上我做的界面) 感谢各位大神光顾和赐教!!!抱拳........

Android UI之自定义——类似iOS的Tabbar

Android UI之自定义--类似iOS的Tabbar Tabbar最早出现在iOS,iOS中的TabBarController实现了这个功能,开发起来相当简单.现在的APP,大多数都会使用Tabbar来作为应用的功能导航,界面简单清晰.那么Android常见的实现是通过RadioGroup来实现,今天将带来自定义实现,补充RadioGroup实现的不足. 先看看常见的软件中的使用: 这个是高铁管家APP,大家应该非常熟悉.这个APP的首页底部就是一个类似iOS的Tabbar.这里就不多举例子

Android开发之自定义HorizontalScrollView视图实现仿ViewPager效果

开发过程中,需要达到 HorizontalScrollView和ViewPager的效果,于是直接重写了HorizontalScrollView来达到实现ViewPager的效果. 实际效果图如下: (1)自定义HorizontalScrollView类:AppHorizontalScrollView实现: package com.czm.ui.view; import java.util.ArrayList; import android.content.Context; import and

[Android UI] ProgressBar自定义

转载自:http://gundumw100.iteye.com/blog/1289348 1: 在JAVA代码中 在java代码中 ProgressBar      继承自View, 在android.widegt包中 ProgressDialog   继承自Dialog, 在 android.app包中. 2: 在XML文件中 ProgressBar 默认是圆形转圈.当为ProgressBar设置style="?android:attr/progressBarStyleHorizontal&q

Android UI组件----自定义ListView实现动态刷新

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3910541.html 联系方式:[email protected] [正文] 一.具体步骤: (1)在activiy_main.xml中加一个ListView控件:再添加一个item的模板activity_main_item.xml,加一个底部加载的视图activity_main_load.xml

Android应用经典主界面框架之一:仿QQ (使用Fragment, 附源码)

最近反复研究日常经典必用的几个android app,从主界面带来的交互方式入手进行分析,我将其大致分为三类.今天记录第一种方式,即主界面下面有几个tab页,最上端是标题栏,tab页和tab页之间不是通过滑动切换的,而是通过点击切换tab页.早期这种架构一直是使用tabhost+activitygroup来使用,随着fragment的出现及google官方也大力推荐使用fragment,后者大有代替前者之势.本文也使用fragment进行搭建,标题中的"经典"指这种交互经典,非本文的代

基于jQuery仿QQ音乐播放器网页版代码

基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="m_player" id="divplayer" role="application" onselectstart="return false" style="left: 0px;"> <div class=&

【Android UI】自定义带按钮的标题栏

自定义标题栏在很多的android app中很常见,可以说是一种很有用的UI设计方法.自 己也本着学习的态度,经过一番各种坑,终于实现了,现总结如下: 一:大致流程 1.      对指定的android activity设置自定义主题风格,其中自定义主题风格是关键 在android 4.0以上版本中如果使用Theme.Holo或者Theme.Light等,程序会 一直报错误-you cannot combine custom title with other feature titles 2.

轻仿QQ音乐之音频歌词播放、锁屏歌词-b

先上效果图 歌词播放界面 音乐播放界面 锁屏歌词界面 一. 项目概述 前面内容实在是太基础..只想看知识点的同学可以直接跳到第三部分的干货 项目播放的mp3文件及lrc文件均来自QQ音乐 本文主要主要讲解锁屏歌词的实现,音频.歌词的播放网上资源略多,因此不做重点讲解,项目也是采取最简单的MVC+storyboard方式 项目GitHub地址: https://github.com/PengfeiWang666/WPFMusicPlayer 音乐模型-->WPFMusic /** 图片 */ @p