Android对View进行包裹, 实现镜面发射效果

这个在TV上用的挺多的, 网上很多都是对ImageView的图片做的, 感觉不是很好, 这里实现了一个可以对任何View做倒影的.

效果图

/**
 *
 * @className: MirrorView
 * @description: 对普通View做封装, 让这个View出现倒影效果, 注意,使用这个View之后,
 *               会让原来的View的Height扩大REFHEIGHT高度, 用来显示反射镜面,
 * @author: gaoshuai
 * @date: 2015年8月11日 上午11:31:16
 */
public class MirrorView extends FrameLayout
{
    private View mContentView;
    protected boolean mHasReflection = true;
    private static int REFHEIGHT = -1;
    public static Paint RefPaint = null;

    private Bitmap mReflectBitmap;
    private Canvas mReflectCanvas;

    public MirrorView(Context context) {
        super(context);

        if (REFHEIGHT == -1)
            REFHEIGHT = 100;
        if (RefPaint == null) {
            RefPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            RefPaint.setShader(new LinearGradient(0, 0, 0, REFHEIGHT, new int[] { 0x77000000, 0x66AAAAAA, 0x0500000, 0x00000000 }, new float[] { 0.0f, 0.1f, 0.9f, 1.0f }, Shader.TileMode.CLAMP));
            RefPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        }

        this.setClickable(true);
    }

    public void setContentView(View view) {
        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.bottomMargin = REFHEIGHT;
        mContentView = view;
        addView(view, lp);
    }

    public View getContentView() {
        return mContentView;
    }

    public void setReflection(boolean ref) {
        mHasReflection = ref;
    }

    @Override
    public boolean performClick() {
        return mContentView.performClick();
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        if (mHasReflection) {
            if (mReflectBitmap == null) {
                mReflectBitmap = Bitmap.createBitmap(mContentView.getWidth(), REFHEIGHT, Bitmap.Config.ARGB_8888);
                mReflectCanvas = new Canvas(mReflectBitmap);
            }
            drawReflection(mReflectCanvas, mContentView); //绘制这个View的反射效果
            canvas.save();
            int dy = mContentView.getBottom();
            int dx = mContentView.getLeft();
            canvas.translate(dx, dy);
            canvas.drawBitmap(mReflectBitmap, 0, 0, null);
            canvas.restore();
        }
    }

    public Bitmap getReflectBitmap() {
        return mReflectBitmap;
    }

    public void drawReflection(Canvas canvas, View view) {
        canvas.save();
        canvas.clipRect(0, 0, view.getWidth(), REFHEIGHT);
        canvas.save();
        canvas.scale(1, -1);
        canvas.translate(0, -view.getHeight());
        view.draw(canvas);
        canvas.restore();
        canvas.drawRect(0, 0, view.getWidth(), REFHEIGHT, RefPaint);
        canvas.restore();
    }
}

测试Activity

public class MainActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FrameLayout container = (FrameLayout) findViewById(R.id.test);
        MirrorView mirrorItemView = new MirrorView(this);
        TextView textView = new TextView(this);
        textView.setWidth(300);
        textView.setText("我就是想测试一下镜子View");
        textView.setBackgroundResource(R.drawable.ic_launcher);
        mirrorItemView.setContentView(textView);
        container.addView(mirrorItemView);
    }
}
时间: 2024-10-19 10:47:31

Android对View进行包裹, 实现镜面发射效果的相关文章

xamarin.android 给View控件 添加数字提醒效果-BadgeView

本文代码从java项目移植到.net项目   java开源项目:https://github.com/jgilfelt/android-viewbadger using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; us

Android -- 自定义view实现keep欢迎页倒计时效果

1,最近打开keep的app的时候,发现它的欢迎页面的倒计时效果还不错,所以打算自己来写写,然后就有了这篇文章. 2,还是老规矩,先看一下我们今天实现的效果 相较于我们常见的倒计时,这次实现的效果是多了外面圆环的不断减少,这也是我们这次自定义view的有意思的一点. 知道了效果我们先来效果分析一波,首先是一个倒计时效果,计时的时候上面的圆弧不断的减少,里面的文字也不断的变化,在视觉上的改变就大致为这两部分,但是实际上我们的ui是由三部分来构成的:里面的实心圆.外面的圆弧.里面的文字.知道了我们u

Android 自定义View实现竖直跑马灯效果

首先给出效果图 中间的色块是因为视频转成GIF造成的失真,自动忽略哈. 大家知道,横向的跑马灯android自带的TextView就可以实现,详情请百度[Android跑马灯效果].但是竖直的跑马灯效果原生Android是不支持的.网上也有很多网友实现了自定义的效果,但是我一贯是不喜欢看别人的代码,所以这篇博客的思路完全是我自己的想法哈. 首先,我们需要给自定义的控件梳理一下格局,如下图所示: 1.首先我们将控件分为三个区块,上面绿色部分为消失不可见的块,中间黑色部分为可见区域,下面红色部分为欲

android自定义view仿照MIUI中音量控制效果

先看效果图: 这就是miui中的音量效果图,实现思路是自定义视图,绘制圆环,然后设置进度显示. 核心代码在onDraw中实现如下: @Override protected void onDraw(Canvas canvas) { float cx = getMeasuredWidth() / 2; float cy = getMeasuredHeight() / 2; r1 = cx - w1 / 2; r2 = cx - w1 / 2 - w2 / 2; r3 = cx - w1 / 2 -

Android自定义View之LoadingLayout

介绍 上一篇博文写了一个通用的加载view,这篇在加载view的基础在包裹一层就是LoadingLayout了,主要的目的是免去每次加载时要隐藏主内容布局,然后加载成功之后显示主内容布局这些繁琐操作.如果你还不了解loadingView,可以简单的看一下上一篇博文:Android 自定义通用的loadingview,实现原理很简单,就是LoadingLayout在包裹内容层的基础上,在代码里添加loadingView作为第二个子view,所以不做过多讲解,大家看完直接下载源码参考. Loadin

深入理解 Android 之 View 的绘制流程

概述 本篇文章会从源码(基于Android 6.0)角度分析Android中View的绘制流程,侧重于对整体流程的分析,对一些难以理解的点加以重点阐述,目的是把View绘制的整个流程把握好,而对于特定实现细节则可以日后再对相应源码进行研读.在进行实际的分析之前,我们先来看下面这张图: 我们来对上图做出简单解释:DecorView是一个应用窗口的根容器,它本质上是一个FrameLayout.DecorView有唯一一个子View,它是一个垂直LinearLayout,包含两个子元素,一个是Titl

Android自定义View学习笔记04

Android自定义View学习笔记04 好长时间没有写相关的博客了,前几周在帮学姐做毕设,所以博客方面有些耽误.过程中写了一个类似wp的磁贴的view,想再写个配套的layout,所以昨天看了一下自定义viewGroup的相关知识-晚上睡觉想了一下可行性不是很高-代码量还不如直接自己在xml上写来得快,速度上也是个问题.今天看了一下张鸿洋老师的Android 自定义View (三) 圆环交替 等待效果这篇博文,再加上前一段时间看到的一幅图,结合之前写的一个圆形imageView的实现博文And

Android自定义View(RollWeekView-炫酷的星期日期选择控件)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53420889 本文出自:[openXu的博客] 目录: 1分析 2定义控件布局 3定义CustomWeekView 4重写onMeasure 5点击后执行动画 7重置预备控件 源码下载 ??最近收到一个自定义控件的需求,需要做一个日期选择控件,实现图如下: ???? ??一次展示一个星期的5天,中间放大的为当前选中的:如果点击了其中一个日期,比如星期五,那么整体向左滑动,并将星期五慢慢放大

Android自定义View(LineBreakLayout-自动换行的标签容器)

??最近一段时间比较忙,都没有时间更新博客,今天公司的事情忙完得空,继续为我的自定义控件系列博客添砖加瓦.本篇博客讲解的是标签自动换行的布局容器,正好前一阵子有个项目中需要,想了想没什么难度就自己弄了.而自定义控件系列文章中对于自定义ViewGroup上次只是讲解了一些基础和步骤 Android自定义ViewGroup(四.打造自己的布局容器),这次就着这个例子我们来完成一个能在项目中使用的自定义布局容器. 1. 初步分析 ??首先我们看一看要完成的效果图: ?????? ??上面红色标示出的就