图片倒影控件ReflectionImage
ReflectionImage是从android.widget.ImageView继承而来,使用方法和其他的Android控件一样
实现思路是从某个网站上剽窃过来的。
实现起来很简单,详细的解释写到注释里面,总体思路就是在Canvas里面重新把原始图片画一次,反转图片用Matrix来做,透明处理实际上是加了一层渐变的蒙板.
源码如下:
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.LinearGradient;
- import android.graphics.Matrix;
- import android.graphics.Paint;
- import android.graphics.PorterDuffXfermode;
- import android.graphics.Bitmap.Config;
- import android.graphics.PorterDuff.Mode;
- 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并重画
- 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,和构造函数里面干了同样的事情
- @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);
- }
- }
android 圆角与倒影
http://lipeng88213.iteye.com/blog/1201993
http://www.devdiv.com/article-2516-1.html
图片倒影控件ReflectionImage相关推荐
- 原创“.NET研究”企业级控件库之图片浏览控件
在上两篇:我介绍了原创企业级控件库之组合查询控件 和原创企业级控件库之大数据量分页控件,受到了很多朋友的支持,给了我很大的动力,在此我特表感谢.有的朋友要求把源码提供上来,我在第一篇就讲了,源码会在我 ...
- Android学习笔记26:图片切换控件ImageSwitcher的使用
在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...
- 图片盒子控件 winform 114868210
图片盒子控件 winform 114868210 引入控件 放图片 控制图片的大小 效果 图片变的与控件一模一样大
- 图片剪裁控件——ClipImageView
这段时间在做自己的项目时,须要使用到图片剪裁功能,当时大概的思考了一些需求.想到了比較简单的实现方法.因此就抽了点时间做了这个图片剪裁控件--ClipImageView 这里先贴上ClipImageV ...
- Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来
转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/8769904 首先题外话,今天早上起床的时候,手滑一下把我的手机甩了出去,结果陪伴我 ...
- Android微信九宫格图片展示控件
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/214 Android微信九宫格图片展示控件 半年前,公司产 ...
- 模仿微信九宫格图片展示控件
主题 仿微信九宫格图片展示控件 github地址:点击打开链接 使用方法以及源码都在github上面
- MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)
惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...
- Android如何设置按钮图片(控件图片)大小自适应
Android如何设置按钮图片(控件图片)大小自适应 在你的button中放入图片:drawble属性,你可以选择它的位置上下左右, 如何让图片自适应? 把图片放入res-drawable-mipma ...
最新文章
- 用python下载辞典
- Linux系统管理(5)——使用yum快速搭建LAMP环境【方便快捷版】
- java自动封箱_java自动封箱是什么意思
- ip复原Java_Java实现 LeetCode 93 复原IP地址
- 制作一个简单HTML个人网页网页(HTML+CSS)大话西游之大圣娶亲电影网页设计
- 金山反间谍清理专家能清除的部分恶意软件清单(截至2007年2月28日更新)
- 【RDMA】RDMA SEND/WRITE编程实例(IBV Verbs )
- 玩转python的正则表达式|提取字符串中的所有数字
- python爬虫58同城租房
- 见证边缘的力量!全球边缘计算大会•上海站顺利召开!
- html语言多行注释,html多行注释方法
- JavaScript实现购物车计算价格功能
- 微信端中的企业号、订阅号、服务号之前的区别
- loadrunnner3
- java 电话号码 打号_java电话号码怎么匹配?
- 360 全球关键信息基础设施网络安全分析报告
- EventBus3.0简单使用快速入门
- 如何在个人微信中免费接入ChatGPT
- 巴菲特爷爷的哲学人生
- 单页应用history模式nginx配置
热门文章
- 迅雷9设置php,Win10系统如何取消迅雷9右侧多余窗口【图文教程】
- Java Holder 使用
- SEM(结构方程模型)
- 古体字与简体字对照表_常用繁体字与简体字对照表
- appium元素坐标定位TouchAction
- 案例分析|戴森如何以DTC全渠道营销打造百亿规模增长
- MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
- 飞凌单片机解密_GX28E01单片机解密
- 王道数据结构线性表:有读者认为直接去掉p结点会造成断链?
- 菜鸟教程css事件,【推荐】DIV+CSS入门菜鸟教程