自定了一个ImageView,和Android揭露效果想同。

 

效果:

 

代码如下:  

CircularRevealImageView.java

import android.content.Context;import android.graphics.Canvas;import android.graphics.Path;import android.graphics.drawable.Drawable;import android.util.AttributeSet;/** * Created by wuguangliang on 2018/11/22 * 

* 揭露效果 * 和ViewAnimationUtils.createCircularReveal一样 */public class CircularRevealImageView extends android.support.v7.widget.AppCompatImageView { private Path path; private float centerX, centerY, startRadius, endRadius; private Thread thread; private float r = 0; private int temp = 1; private int nanos; public CircularRevealImageView(Context context) { super(context); init(); } public CircularRevealImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CircularRevealImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { path = new Path(); path.addCircle(0, 0, 0, Path.Direction.CW); initRenderThread(); } private void initRenderThread() { thread = new Thread(new Runnable() { @Override public void run() { while (r <= endRadius - startRadius && r >= 0) { try { Thread.sleep(0, nanos); r += temp; if (r < 0) { r = 0; break; } else if (r > endRadius - startRadius) { r = endRadius - startRadius; break; } } catch (InterruptedException e) { e.printStackTrace(); } } thread = null; if (r == 0) { post(new Runnable() { @Override public void run() { setImageBitmap(null); } }); } } }); } @Override protected void onDraw(Canvas canvas) { path = new Path(); path.addCircle(centerX, centerY, r, Path.Direction.CW); canvas.clipPath(path); super.onDraw(canvas); invalidate(); } /** * 开始动画 * * @param centerX The x coordinate of the center of the animating circle, relative to * view. * @param centerY The y coordinate of the center of the animating circle, relative to * view. * @param startRadius The starting radius of the animating circle. * @param endRadius The ending radius of the animating circle. * @param nanos 执行时间,纳秒 */ public void start(final float centerX, final float centerY, final float startRadius, final float endRadius, final int nanos) { temp = 1; this.centerX = centerX; this.centerY = centerY; this.startRadius = startRadius; this.endRadius = endRadius; this.nanos = nanos; if (thread == null) { initRenderThread(); } if (!thread.isAlive()) { thread.start(); } } /** * 返回动画,直接返回到start的点。 * * @param nanos 执行时间,ns */ public void back(final int nanos) { this.nanos = nanos; temp = -1; if (thread == null) { initRenderThread(); } if (!thread.isAlive()) { thread.start(); } } /** * 返回动画,返回到新的点 * * @param centerX The x coordinate of the center of the animating circle, relative to * view. * @param centerY The y coordinate of the center of the animating circle, relative to * view. * @param startRadius The starting radius of the animating circle. * @param endRadius The ending radius of the animating circle. * @param nanos 执行时间,ns */ public void back(final float centerX, final float centerY, final float startRadius, final float endRadius, final int nanos) { this.centerX = centerX; this.centerY = centerY; this.startRadius = startRadius; this.endRadius = endRadius; this.nanos = nanos; r = endRadius - startRadius; temp = -1; if (thread == null) { initRenderThread(); } if (!thread.isAlive()) { thread.start(); } } @Override public void setBackgroundResource(int resId) { new Throwable("不可用,用了没效果"); } @Override public void setBackgroundDrawable(Drawable background) { new Throwable("不可用,用了没效果"); } @Override public void setBackground(Drawable background) { new Throwable("不可用,用了没效果"); }}

使用方式:

MainActivity.java

 final CircularRevealImageView imageView = findViewById(R.id.my_image);        findViewById(R.id.apex_btn_add).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                imageView.setImageDrawable(getResources().getDrawable(R.drawable.mbg_2_1));                imageView.start(500, 900, 0, 1080,200);            }        });        findViewById(R.id.apex_btn_remove).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                imageView.back(200);            }        });

 

更多相关文章

  1. android 属性动画
  2. Android(安卓)7.0 如何去掉灭屏动画
  3. Android(安卓)新加几个开源项目
  4. 2011.08.30——— android setOnTouchListener onTouchEvent
  5. 2011.08.30——— android setOnTouchListener onTouchEvent
  6. Android(安卓)RecyclerView
  7. Android关于常用正则号码类Util
  8. Android如何实现ListView的Item松开渐变效果?
  9. Android关于常用正则号码类Util

随机推荐

  1. Android 中 获取“back”键和“home”键,
  2. [Android] 任意时刻从子线程切换到主线程
  3. Android(安卓)Launcher3 禁止用户拖动图
  4. Bringup wifi driver to android 6.0
  5. Android ScrollView滚动示图显示
  6. Android之关于图表
  7. android 多媒体部分学习笔记十二----medi
  8. android如何建立数据库。(如何重写SQLiteO
  9. Android中ImageSwitcher结合Gallery展示S
  10. 最新android视频地址及android4.2环境地