本文源自:http://blog.csdn.net/kenshintang1215/article/details/5804236


效果图如下:




代码如下:
package lab.sodino.reflection;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.LinearGradient;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.graphics.Shader.TileMode;import android.graphics.drawable.BitmapDrawable;import android.util.AttributeSet;import android.widget.ImageView;public class ReflectionImage extends ImageView {// 是否为Reflection模式private boolean mReflectionMode = true;public ReflectionImage(Context context) {super(context);}public ReflectionImage(Context context, AttributeSet attrs) {super(context, attrs);measure(0, 0);// 取得原始图片的bitmap并重画Bitmap originalImage = ((BitmapDrawable) this.getDrawable()).getBitmap();DoReflection(originalImage);}public ReflectionImage(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);Bitmap originalImage = ((BitmapDrawable) this.getDrawable()).getBitmap();DoReflection(originalImage);}public void setReflectionMode(boolean isRef) {mReflectionMode = isRef;}public boolean getReflectionMode() {return mReflectionMode;}// 偷懒了,只重写了setImageResource,和构造函数里面干了同样的事情@Overridepublic void setImageResource(int resId) {Bitmap originalImage = BitmapFactory.decodeResource(getResources(), resId);DoReflection(originalImage);// super.setImageResource(resId);}private void DoReflection(Bitmap originalImage) {// 原始图片和反射图片中间的间距final int reflectionGap = 4;int width = originalImage.getWidth();int height = originalImage.getHeight();// 反转Matrix matrix = new Matrix();// 第一个参数为1表示x方向上以原比例为准保持不变,正数表示方向不变。// 第二个参数为-1表示y方向上以原比例为准保持不变,负数表示方向取反。matrix.preScale(1, -0.75f);// reflectionImage就是下面透明的那部分,可以设置它的高度为原始的3/4,这样效果会更好些Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, 0, width, height * 3 / 4, matrix, false);// 创建一个新的bitmap,高度为原来的两倍Bitmap bitmap4Reflection = Bitmap.createBitmap(width, (height + height * 3 / 4), Config.ARGB_8888);// 其宽*高 = width * (height + height * 3 / 4)Canvas canvasRef = new Canvas(bitmap4Reflection);// 先画原始的图片canvasRef.drawBitmap(originalImage, 0, 0, null);// 画间距Paint deafaultPaint = new Paint();// defaultPaint不能为null,否则会有空指针异常。canvasRef.drawRect(0, height, width, height + reflectionGap, deafaultPaint);// 画被反转以后的图片canvasRef.drawBitmap(reflectionImage, 0, height + reflectionGap, null);// 创建一个渐变的蒙版放在下面被反转的图片上面Paint paint = new Paint();LinearGradient shader = new LinearGradient(200, originalImage.getHeight(), 10, bitmap4Reflection.getHeight()+ reflectionGap, 0x80ffffff, 0x00ffffff, TileMode.CLAMP);paint.setShader(shader);// Set the Transfer mode to be porter duff and destination inpaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));// 将蒙板画上canvasRef.drawRect(0, height, width, bitmap4Reflection.getHeight() + reflectionGap, paint);// 调用ImageView中的setImageBitmapthis.setImageBitmap(bitmap4Reflection);}}


更多相关文章

  1. Android(安卓)matrix 控制图片的旋转、缩放、移动
  2. android拍照与读取相册
  3. Android(安卓)报错:Caused by: android.os.FileUriExposedExcepti
  4. android解决坚屏拍照和保存图片旋转90度的问题,并兼容4.0
  5. [Android]在App中使用相机
  6. android调用setRequestedOrientation之后
  7. android WebView 图片缩放功能小结
  8. Android(安卓)主流图片库Picasso Glide Fresco对比分析
  9. android背景选择器selector用法汇总

随机推荐

  1. Android:ScaleGestureDetector 缩放手势检
  2. Android底部导航栏最常用的两种写法
  3. android imageView详解
  4. [Android]Eclipse连不上模拟器的问题[emu
  5. android中获取string字符串的方法
  6. android 将程序设置为app2sd
  7. Android-View-Attribute
  8. Android 中.aar文件生成方法与用法
  9. android:configChanges问题
  10. android 类似QQ 换皮肤 实现思路 apk资源