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,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
81 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
3月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
71 20
Android经典面试题之图片Bitmap怎么做优化
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
106 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
7月前
|
Android开发
Android通过手势(多点)缩放和拖拽图片
Android通过手势(多点)缩放和拖拽图片
56 4
|
7月前
|
Java Android开发
android 下载图片的问题
android 下载图片的问题
48 3
|
4月前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
114 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
4月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
4月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
263 4
|
4月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
101 0
|
4月前
|
XML 前端开发 Android开发
Android经典实战之Kotlin中实现圆角图片和圆形图片
本文介绍两种实现圆角图像视图的方法。第一种是通过自定义Kotlin `AppCompatImageView`,重写`onDraw`方法使用`Canvas`和`Path`进行圆角剪裁。第二种利用Android Material库中的`ShapeableImageView`,简单配置即可实现圆角效果。两种方法均易于实现且提供动态调整圆角半径的功能。
85 0