Android实现文字倒影

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

[img]http://dl.iteye.com/upload/attachment/0074/7085/7bed906d-79e0-3416-a6b8-050452f4bab5.png[/img]


/*
* 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 titanchen2000@yahoo.com.cn
*
* @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);
}

}

参考链接:[url]http://www.eoeandroid.com/forum.php?mod=viewthread&tid=74623[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值