自定义控件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