歌词效果制作

首先看一下效果图

大概的思想:先画出颜色为红色的一行文字,测量文字的宽度,假如说是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);
	}

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡拉歌词编辑器 配合播放器使用的歌词编辑器,除了有普通的歌词编辑器的逐行添加时间标记的功能外,还能为每个字添加时间标记,从而生成能为播放器识别的kok歌词文件。在歌词编辑器中内置了播放器,使编辑过程更方便。 【使用技巧】: 1、在普通歌词编辑状态下,每插入一个时间标记,光标会自动移到下一行 2、要进行精确到字的歌词编辑,请打开“精确到字”开关,此时,每插入一个时间标签,光标会自动移到一下个字(标点等不重要的字会被自动跳过),到了一行的结束时会自动跳到一下行。 3、在精确到字的模式下关于空格的处理。本编辑器对于英文是以空格作为单词的分格符的,因此每个单词之间的空格是不可缺少的。在英文中的空格是会被自动跳过的。但在中文中,空格也有重要的用途,那就是有时候在唱完一句之后需要换气,这就有个停顿,这时就可以为空格加上时间标记。但有时在一句话中并不需要停顿,但为了语义的需要,原始歌词文件(比如txt)中会有空格,在这种情况下,如果跟着节怕走,就会在有空格的地方出现乱子。因此建议在这些地方把空格去掉,或加上标点(中英文的标点都可以,标点会被自动跳过的)。如下面的这句(S.H.E的长相思): “若拥抱时光太少 太短 青春多荒凉” 原始歌词中可能会有两个空格,但实际上唱的时候中间是没有间断的,因此可以把上面的空格去掉或是加上标点。最好还是去掉空格,因为标点显示也会占用时间。 4、在英文的句子中如果需要换气,可以在换气的地方多加一个空格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值