Android实现文字倒影

思路:
自定义控件ReflectTextView继承TextView,重写onDraw()方法,在onDraw()中得到canvas,将其转化为Bitmap,再创建Bitmap的倒影,最后将Bitmap倒影重绘到canvas上。
需要注意的是:要在onMeasure()中将高度增加为原来的2倍。而且只能支持文本长度为一行的情况。




/*
 * Copyright (C) 2011 TC Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language governing permissions and limitations under the
 * License. This code is base on the Android TextView and was Created by [email protected]
 * 
 * @author TC
 */
package com.tc.reflect;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.util.AttributeSet;
import android.widget.TextView;

public class ReflectTextView extends TextView {

	private Matrix mMatrix;
	private Paint mPaint;
	
	public ReflectTextView(Context context) {
		super(context);
		init();
	}

	public ReflectTextView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

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

	private void init() {
		//make the shadow reverse of Y 
		mMatrix = new Matrix();
		mMatrix.preScale(1, -1);
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight()*2);
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		//draw the text from layout()
		super.onDraw(canvas);

		int height = getHeight();
		int width = getWidth();

		//make sure you can use the cache
		setDrawingCacheEnabled(true);

		//create bitmap from cache,this is the most important of this 
		Bitmap originalImage = Bitmap.createBitmap(getDrawingCache());
		
		//create the shadow
		Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
				0, width, height/2, mMatrix, false);
		
		//draw the shadow
		canvas.drawBitmap(reflectionImage, 0, height/2, null);
		
		if (mPaint == null) {
			//process shadow bitmap to make it shadow like
			mPaint = new Paint();
			LinearGradient shader = new LinearGradient(0, height/2, 0,
					height, 0x7fffffff, 0x0fffffff, TileMode.CLAMP);		
			mPaint.setShader(shader);		
			mPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
		}
		
		canvas.drawRect(0, height/2, width, height, mPaint);
	}
	
}

参考链接: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=74623

猜你喜欢

转载自ipjmc.iteye.com/blog/1693735