Android笔记:图片倒影、ReflectionImage

简介:

ReflectionImage类代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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);
         // 取得原始图片的bitmap并重画
         BitmapDrawable bd = (BitmapDrawable)  this .getDrawable();
         Bitmap originalImage = bd.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,和构造函数里面干了同样的事情
     @Override
     public  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();
         matrix.preScale( 1 , - 1 );
         // reflectionImage就是下面透明的那部分,可以设置它的高度为原始的3/4,这样效果会更好些
         Bitmap reflectionImage = Bitmap.createBitmap(originalImage,  0 0 , width, height, matrix,  false );
         // 创建一个新的bitmap,高度为原来的两倍
         Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height), Config.ARGB_8888);
         Canvas canvasRef =  new  Canvas(bitmapWithReflection);
                   
         // 先画原始的图片
         canvasRef.drawBitmap(originalImage,  0 0 null );
         // 画间距
         Paint deafaultPaint =  new  Paint();
         canvasRef.drawRect( 0 , height, width, height + reflectionGap, deafaultPaint);
                   
         // 画被反转以后的图片
         canvasRef.drawBitmap(reflectionImage,  0 , height + reflectionGap,  null );
         // 创建一个渐变的蒙版放在下面被反转的图片上面
         Paint paint =  new  Paint();
         LinearGradient shader =  new  LinearGradient( 0 , originalImage.getHeight(),  0 , bitmapWithReflection.getHeight() + reflectionGap,  0x80ffffff 0x00ffffff ,
                 TileMode.CLAMP);
         // Set the paint to use this shader (linear gradient)
         paint.setShader(shader);
         // Set the Transfer mode to be porter duff and destination in
         paint.setXfermode( new  PorterDuffXfermode(Mode.DST_IN));
         // Draw a rectangle using the paint with our linear gradient
         canvasRef.drawRect( 0 , height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);
         // 调用ImageView中的setImageBitmap
         this .setImageBitmap(bitmapWithReflection);
     }
}











本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1290667,如需转载请自行联系原作者

目录
相关文章
|
4天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
51 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
4天前
|
XML Java Android开发
Android Studio App开发之对图片进行简单加工(包括放缩,旋转等等 附源码)
Android Studio App开发之对图片进行简单加工(包括放缩,旋转等等 附源码)
52 0
|
4天前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
51 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
4天前
|
XML Java Android开发
Android Studio App开发之使用相机拍摄照片和从相册中选取图片(附源码 超详细必看)
Android Studio App开发之使用相机拍摄照片和从相册中选取图片(附源码 超详细必看)
234 0
|
4天前
|
Java Android开发
android 下载图片的问题
android 下载图片的问题
13 3
|
4天前
|
Android开发
Android通过手势(多点)缩放和拖拽图片
Android通过手势(多点)缩放和拖拽图片
13 4
|
2天前
|
Java 测试技术 开发工具
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
|
2天前
|
设计模式 缓存 前端开发
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer
|
4天前
|
Android开发
Android中Glide加载Https图片失败的解决方案
Android中Glide加载Https图片失败的解决方案
18 1
|
4天前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
29 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库