`
landyer
  • 浏览: 139021 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android自定义控件-ReflectionImage

阅读更多

ReflectionImage是一个有倒影效果的图片.先来看看长什么样子的吧...

 

ReflectionImage是从Android.widget.ImageView继承而来,使用方法和其他的Android控件一样

 

实现起来很简单,详细的解释写到注释里面,总体思路就是在Canvas里面重新把原始图片画一次,反转图片用Matrix来做,透明处理实际上是加了一层渐变的蒙板.



package com.myview;  
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 Bitmap用法总结

    android Bitmap用法总结 Bitmap用法总结 1、Drawable → Bitmap public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable....

    带有倒影的Gallery

    //reflectionImage就是下面那个透明的倒影,宽为图片本来的宽度,高是图片高度的一半 //从height/2的高度开始到高度为(height/2)+(height/4) Bitmap reflectionImage = Bitmap.createBitmap(originalImage...

    埃森哲制药企业数字化转型项目顶层规划方案glq.pptx

    埃森哲制药企业数字化转型项目顶层规划方案glq.pptx

    华为OD机试D卷 - 机场航班调度程序 - 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

    基于FPGA读取设计的心电图代码源码+全部资料齐全.zip

    【资源说明】 基于FPGA读取设计的心电图代码源码+全部资料齐全.zip基于FPGA读取设计的心电图代码源码+全部资料齐全.zip 【备注】 1、该项目是高分课程设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过mac/window10/11/linux测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    基于Hadoop平台的分布式搜索引擎的设计与实现+部署文档+全部资料 高分项目.zip

    【资源说明】 基于Hadoop平台的分布式搜索引擎的设计与实现+部署文档+全部资料 高分项目.zip基于Hadoop平台的分布式搜索引擎的设计与实现+部署文档+全部资料 高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    华为OD机试D卷 - 数的分解 - 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

    基于Hadoop的智能购书系统的设计与实现+部署文档+全部资料 高分项目.zip

    【资源说明】 基于Hadoop的智能购书系统的设计与实现+部署文档+全部资料 高分项目.zip基于Hadoop的智能购书系统的设计与实现+部署文档+全部资料 高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    setuptools-27.2.0.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于 python 在树莓派上面实现摄像头视频人脸识别

    【作品名称】:基于 python 在树莓派上面实现摄像头视频人脸识别 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于 python 在树莓派上面实现摄像头视频人脸识别

    setuptools-28.4.0.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    setuptools-16.0.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    setuptools-68.2.0-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于MQTT的校园新闻APP原生Android源码.zip

    基于MQTT的校园新闻APP原生Android源码.zip基于MQTT的校园新闻APP原生Android源码.zip基于MQTT的校园新闻APP原生Android源码.zip基于MQTT的校园新闻APP原生Android源码.zip基于MQTT的校园新闻APP原生Android源码.zip基于MQTT的校园新闻APP原生Android源码.zip基于MQTT的校园新闻APP原生Android源码.zip基于MQTT的校园新闻APP原生Android源码.zip

    setuptools-0.9.8-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    电压检测系统(含VB上位机+下位机程序)proteus仿真+程序资料

    【作品名称】:电压检测系统(含VB上位机+下位机程序)proteus仿真+程序资料 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:电压检测系统(含VB上位机+下位机程序)proteus仿真+程序资料

    第三讲python基础day03.zip

    第三讲python基础day03.zip

    电子周跟踪:AI市场竞争加剧,AIPC加速落地,关注联想4月18日科技创新大会.pdf

    电子元件 电子行业 行业分析 数据分析 数据报告 行业报告

    华中科技大学电信专业 课程资料 作业 代码 实验报告-操作系统-内含源码和说明书.zip

    华中科技大学电信专业 课程资料 作业 代码 实验报告-操作系统-内含源码和说明书.zip

    基于Hadoop的VGI矢量空间数据管理方法研究.docx

    本研究提出了基于Hadoop的VGI矢量空间数据管理方法,旨在解决VGI数据管理中的诸多挑战。通过利用Hadoop的分布式计算平台,实现了对VGI数据的高效管理和分析,提高了数据的准确性和一致性。 适用人群:本研究的方法适用于地理信息系统领域的研究人员、空间数据管理者、以及对VGI数据感兴趣的社会学者和政策制定者。 使用场景及目标:该方法可以应用于处理大量VGI数据的管理和分析,为地理信息系统的应用提供更准确、更及时的数据支持。在实际场景中,可以用于城市规划、交通管理、环境监测等领域的数据处理和分析工作,促进社会各个领域的发展和进步。 其他说明:通过实验和案例分析验证了基于Hadoop的VGI矢量空间数据管理方法的有效性和可行性,展示了其在实际应用中的优势和潜力。该方法对于推动VGI数据的管理和应用具有重要的意义,为地理信息系统和空间数据管理领域的进步提供了新的思路和方法。

Global site tag (gtag.js) - Google Analytics