我们所有的view都继承自View类,View类里有个方法叫ondraw(). 即,我们看到的界面都是画出来的,所以我们可以重写ondraw()方法。
既然知道了这点就好办了,还有个难点就是,我们的倒影也是画出来的,那我们从哪去取原始图片呢?熟悉View的童鞋都知道Cache这个东西,不错,就是通过Cache我们取到了原始图片。
放源码了。,感谢期待。这个只是个demo,并不完善哈,布局什么的还需要调整下,或者我什么时候有空再进行一次封装,就可以直接从布局文件中任意调整了。
布局文件中增加如下代码
代码如下 | 复制代码 |
android:layout_marginTop="20dp" android:id="@+id/test_reflect"android:layout_width="fill_parent" android:layout_height="50dp"android:textSize="25dp" android:textColor="#ff0000"android:textStyle="bold"android:gravity="top|center_horizontal" android:text="不会飞翔的翅膀 XP.C"/> android:layout_marginTop="20dp" android:id="@+id/test_reflect"android:layout_width="fill_parent" android:layout_height="50dp"android:textSize="25dp" android:textColor="#a0a0a0"android:textStyle="italic"android:gravity="top|center_horizontal" android:text="[email protected]"/> |
类代码如下:
代码如下 | 复制代码 |
/* * 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 */ packagecom.tc.reflect; importandroid.content.Context; importandroid.graphics.Bitmap; importandroid.graphics.Canvas; importandroid.graphics.LinearGradient; importandroid.graphics.Matrix; importandroid.graphics.Paint; importandroid.graphics.PorterDuffXfermode; importandroid.graphics.PorterDuff.Mode; importandroid.graphics.Shader.TileMode; importandroid.util.AttributeSet; importandroid.widget.TextView; publicclassReflectTextViewextendsTextView { publicReflectTextView(Context context) { super(context); } publicReflectTextView(Context context, AttributeSet attrs,intdefStyle) { super(context, attrs, defStyle); } publicReflectTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protectedvoidonDraw(Canvas canvas) { //draw the text from layout() super.onDraw(canvas); intheight = getHeight(); intwidth = getWidth(); //make the shadow reverse of Y Matrix matrix =newMatrix(); matrix.preScale(1, -1); //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, height /3, width, height /3, matrix,false); //draw the shadow canvas.drawBitmap(reflectionImage,0,8* height /12,null); //process shadow bitmap to make it shadow like Paint paint =newPaint(); LinearGradient shader =newLinearGradient(0,8* height /12,0, height,0x70ffffff,0x00ffffff, TileMode.CLAMP); paint.setShader(shader); paint.setXfermode(newPorterDuffXfermode(Mode.DST_IN)); canvas.drawRect(0,8* height /12, width, height, paint); } } |