歌词效果制作

首先看一下效果图

大概的思想:先画出颜色为红色的一行文字,测量文字的宽度,假如说是1000,那么截取1000的十分之一的区域,把颜色为蓝色的的一行字画在合格矩形里面。

部分代码如下:

package com.example.custom.sz;

import com.example.custom.R;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
/**
 *
 * @author 吴传龙
 * QQ:312037487
 */
public class ColorTrackView extends View {

	private Context mContext;
	private String mText;
	private int mTextSize;
	private int mTextOriginColor;// 文字原来的颜色
	private int mTextChangeColor;// 文字改变的额颜色
	private float mProgress;
	private Paint mPaint;
	private int mTextRealWidth;

	public void init(Context context, AttributeSet attrs, int defStyleAttr) {
		mContext = context;
		TypedArray ta = context.obtainStyledAttributes(attrs,
				R.styleable.colorTrackView);
		mText = ta.getString(R.styleable.colorTrackView_text);
		mTextSize = ta.getDimensionPixelSize(
				R.styleable.colorTrackView_text_size, mTextSize);
		mTextOriginColor = ta.getColor(
				R.styleable.colorTrackView_text_origin_color, mTextOriginColor);
		mTextChangeColor = ta.getColor(
				R.styleable.colorTrackView_text_change_color, mTextChangeColor);
		mProgress = ta.getFloat(R.styleable.colorTrackView_progress, 0);
		ta.recycle();
		mPaint = new Paint();
		mPaint.setAntiAlias(true);
		mPaint.setColor(mTextOriginColor);
		mPaint.setTextSize(mTextSize);
		measureText();
	}

	private int mHeight;

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int width = measureWidth(widthMeasureSpec);
		mHeight = measureHeight(heightMeasureSpec);
		setMeasuredDimension(width, mHeight);
	}

	@Override
	public void draw(Canvas canvas) {
		super.draw(canvas);
		mPaint.setColor(Color.RED);
		canvas.drawText(mText, getPaddingLeft(),
				getPaddingTop() - mPaint.ascent(), mPaint);
		if (drawTopText){
			canvas.save();
			mPaint.setColor(Color.BLUE);
			canvas.clipRect(getPaddingLeft(), 0, mProgress, mHeight);
			canvas.drawText(mText, getPaddingLeft(),
					getPaddingTop() - mPaint.ascent(), mPaint);
			canvas.restore();
		}
	}

	public void measureText() {
		mTextRealWidth = (int) mPaint.measureText(mText) - getPaddingLeft()
				- getPaddingRight();
	}

	private boolean drawTopText = false;
	public void setProgress(final int from, final int to) {
		new Thread() {
			public void run() {
				measureText();
				drawTopText = true;
				int go = 3000 / mTextRealWidth;
				while(true){
					for (int progress = 0; progress < mTextRealWidth;) {
						mPaint.setColor(mTextChangeColor);
						progress += go;
						mProgress = progress;
						postInvalidate();
						try {
							sleep(100);
						} catch (InterruptedException e) {
						}
					}
					drawTopText = false;
					postInvalidate();
					drawTopText = true;
				}

			};
		}.start();
	}

	public int measureWidth(int widthMeasureSpec) {
		int resultSize;
		int mode = MeasureSpec.getMode(widthMeasureSpec);
		int size = MeasureSpec.getSize(widthMeasureSpec);

		if (mode == MeasureSpec.EXACTLY) {
			resultSize = size;
		} else {
			resultSize = (int) (mPaint.measureText(mText) - getPaddingLeft() - getPaddingRight());
			if (mode == MeasureSpec.AT_MOST) {
				resultSize = Math.min(resultSize, size);
			}
		}
		return resultSize;
	}

	public int measureHeight(int heightMeasureSpec) {
		int resultSize;
		int mode = MeasureSpec.getMode(heightMeasureSpec);
		int size = MeasureSpec.getSize(heightMeasureSpec);

		if (mode == MeasureSpec.EXACTLY) {
			resultSize = size;
		} else {
			resultSize = (int) (mPaint.descent() - mPaint.ascent()
					+ getPaddingTop() + getPaddingBottom());
			if (mode == MeasureSpec.AT_MOST) {
				resultSize = Math.min(resultSize, size);
			}
		}
		return resultSize;
	}

	public ColorTrackView(Context context) {
		this(context, null, 0);
	}

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

	public ColorTrackView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 17:43:47

歌词效果制作的相关文章

Delphi以GDI+制作桌面歌词效果

在Windows XP下效果图: 在Windows 7下有焦点时效果图: 在Windows 7下无焦点时效果图: 在Windows 7下右键菜单效果图: 很多音频播放软件都带有桌面歌词效果,在桌面上显示歌词字幕,可以设置是否置顶桌面,是否背景穿透等等.要实现这样的效果方法有很多种,利用GDI+的特性来实现桌面歌词效果,可以达到歌词字幕的平滑柔和.在参考了CodeProject的一篇文章,文章标题<To Create A COOL Desktop Lyrics Demo >链接地址:http:/

模仿京东顶部搜索条效果制作的一个小demo

最近模仿京东顶部搜索条效果制作的一个小demo,特贴到这里,今后如果有用到可以参考一下,代码如下 1 #define kScreenWidth [UIScreen mainScreen].bounds.size.width 2 #define kScreenHeight [UIScreen mainScreen].bounds.size.height 3 4 #import "mainViewController.h" 5 6 @interface mainViewController

Qt的卡拉OK歌词效果

先上图一张.. 驳壳地址:http://blog.csdn.net/robertkun 实现卡拉OK效果, 主要是使用了QPainter的叠加, pTmp.setCompositionMode(QPainter::CompositionMode_Source); pTmp.fillRect(QRect(0, 0, paintw, rtText.height()), QBrush(Qt::white)); pTmp.fillRect(QRect(0, 0, mPrecent, rtText.hei

jquery图片放大镜效果制作变焦镜头图片放大查看

jquery图片放大镜效果制作变焦镜头图片放大查看 http://www.17sucai.com/pins/demoshow/8511

ps雨滴效果制作

雨滴效果制作 尽量选择比较暗或者有人打伞的照片,方便制作雨天的效果 新建图层,设置前景色为黑色,并填充新建的图层为黑色 选择滤镜->杂色->添加杂色,数量设置为150左右(设置得越大后面的效果会越像雪),勾选单色,分布方式无所谓,点击确定 矩形选框工具框选一块,Ctrl+J复制一层(如果在前面新建的图层上做雨滴,就过于密集,这时可以删除上一个图层) Ctrl+T自由变换,将刚才复制的图层放大到盖住图片 将混合模式改为滤色 Ctrl+L,调出色阶,扩大黑色区(将左边的滑块向右调),让白色区越来越

利用CSS3D效果制作简易旋转木马效果

最近看一下css3d的一些特性,想着也实验学习一下,制作个小demo之类的.就练习了一下.开发一个粗糙的选择木马效果,如图 其实就是找到角度和位置,计算每根柱子的旋转角度摆放到3d空间的置顶位置即可.然后利用css的animate属性让3d舞台无线旋转,就有了一简易的旋转木马效果.感兴趣的可以看一下,可以把代码中的图片路径改为自己的图片地址就行了.直接可用. 代码如下: <!DOCTYPE html> <html> <head lang="en">

酷狗音乐展示滚动歌词效果的控件实现

文章来自http://blog.csdn.net/zhaodecang 在音乐播放器项目中使用到酷狗音乐展示歌词的效果,需要支持修改字体.颜色.渐变色等功能 截图如下(效果不是很好,请下载Demo查看) 歌词绘制流程核心代码如下(具体实现过程请看Github源码) @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 中心Y坐标 float centerY = getHeight() / 2 + mTe

Winform控件的水印效果制作

在我们的项目中,为控件绘制水印效果是十分常见的事情,下面我就来说说水印效果的制作方式.其实在绝大多数情况下只有下拉框和输入框多会使用水印,比如我们看到的新浪邮箱,(如:图1).下面是输入框水印效果的代码实现:using System.Drawing;using System.Windows.Forms;namespace TextBoxWithWaterkmarkExample{ /// <summary> /// 带水印效果的TextBox /// </summary>    p

3、黑白照效果制作

废话就不多说,先下载一张图片,在这里我下载的是一张刘亦菲的照片 原图: 1.先进行去色操作:按下快捷键Ctrl+Shift+U或者选择图像--调整--去色 2.再进行对比度的调整,Ctrl+M或者图像--调整--曲线,效果如下: 3.新建一个图层,并将这个图层填充为白色,然后将这个图层设置为不透明度为30(建议20到40之间) 4.用钢笔工具描外轮廓,目的是为了突出某个部位的效果,然后选择笔刷工具,将笔刷设置为1像素(这里可以根据需要自行设置),最后选择路径选择工具,右击钢笔工具描画的轮廓,选择