RevealView

简介: 记录一个demo,自己很喜欢 ©程序亦非猿 InstalMaterial学习笔记之Reveal效果 ,坚持不懈向大神学习。。先看效果001.

记录一个demo,自己很喜欢 ©程序亦非猿 InstalMaterial学习笔记之Reveal效果 ,坚持不懈向大神学习

。。

先看效果

001.gif

再看代码

<pre>
package github.alex.revealview;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Interpolator;

/**
* Created by Miroslaw Stanek on 18.01.15.
*/
public class RevealView extends View {
/**填充色*/
private Paint fillPaint;
/**初始化状态*/
public static final int state_not_started = 0;
/**揭露动画开始*/
public static final int state_fill_started = 1;
/**揭露动画完成*/
public static final int state_finished = 2;
private int state = state_not_started;
/**开始的X坐标,相对于手机屏幕,不包括状态栏*/
private int startLocationX;
/**开始的Y坐标,相对于手机屏幕,不包括状态栏*/
private int startLocationY;
/**当前揭露动画的半径*/
private int currentRadius;
private ObjectAnimator revealAnimator;
private Interpolator interpolator = null;
private OnStateChangeListener onStateChangeListener;
/**揭露动画的时间*/
private int fillTime;
public RevealView(Context context) {
super(context);
}
public RevealView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}

private void initView() {
    fillPaint = new Paint();
    fillPaint.setStyle(Paint.Style.FILL);
    fillPaint.setColor(Color.WHITE);
    interpolator = new AccelerateInterpolator();
    fillTime = 400;
}
public void setFillColor(int color) {
    fillPaint.setColor(color);
}
public void startFromLocation(int[] tapLocationOnScreen) {
    changeState(state_fill_started);
    startLocationX = tapLocationOnScreen[0];
    startLocationY = tapLocationOnScreen[1];
    /\*此时 利用反射机制 自动调用setCurrentRadius方法,并将参数传递过去\*/
    revealAnimator = ObjectAnimator.ofInt(this, "currentRadius", 0, getWidth() + getHeight()).setDuration(fillTime);
    revealAnimator.setInterpolator(interpolator);
    revealAnimator.addListener(new MyAnimatorListenerAdapter());
    revealAnimator.start();
}
private void changeState(int state) {
    if (this.state == state) {
        return;
    }
    this.state = state;
    if (onStateChangeListener != null) {
        onStateChangeListener.onStateChange(state);
    }
}
public void setCurrentRadius(int radius) {
    this.currentRadius = radius;
    invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
    if (state == state_finished) {
        canvas.drawRect(0, 0, getWidth(), getHeight(), fillPaint);
    } else {
        canvas.drawCircle(startLocationX, startLocationY, currentRadius, fillPaint);
    }
}
private final class MyAnimatorListenerAdapter extends AnimatorListenerAdapter
{
    @Override
    public void onAnimationEnd(Animator animation) {
        changeState(state_finished);
    }
}
public void setOnStateChangeListener(OnStateChangeListener onStateChangeListener) {
    this.onStateChangeListener = onStateChangeListener;
}
public static interface OnStateChangeListener {
    void onStateChange(int state);
}

}

</pre>

<pre>

public class NewActivity extends AppCompatActivity {
private RevealView revealView;
private int[] location;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);
location = getIntent().getExtras().getIntArray("location");
initView();
}
private void initView() {
findViewById(R.id.bt_5).setOnClickListener(new MyOnClickListener());
revealView = (RevealView) findViewById(R.id.rv);
revealView.setVisibility(View.VISIBLE);
revealView.setFillColor(Color.parseColor("#BBFF5722"));
/*当一个视图树将要绘制时,所要调用的回调函数的接口类*/
revealView.getViewTreeObserver().addOnPreDrawListener(new MyOnPreDrawListener());
revealView.setOnStateChangeListener(new MyOnStateChangeListener());
}

private final class MyOnClickListener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        finish();
    }
}

private final class MyOnStateChangeListener implements RevealView.OnStateChangeListener {
    @Override
    public void onStateChange(int state) {
        if (state == RevealView.state_finished) {
            revealView.setVisibility(View.GONE);
        }
    }
}

private final class MyOnPreDrawListener implements ViewTreeObserver.OnPreDrawListener {
    @Override
    public boolean onPreDraw() {
        //必须remove掉 不然会重复调用
        revealView.getViewTreeObserver().removeOnPreDrawListener(this);
        revealView.startFromLocation(location);
        return false;
    }
}

}

</pre>

目录
相关文章
|
关系型数据库 数据库 数据安全/隐私保护
Docker-10:Docker安装PostgreSQL
通过容器化Docker 安装 postgrel
4588 0
Docker-10:Docker安装PostgreSQL
|
前端开发 网络协议 Dubbo
超详细Netty入门,看这篇就够了!
本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。
83688 30
超详细Netty入门,看这篇就够了!
|
消息中间件 存储 API
【Docker】7、Docker安装RabbitMQ服务
–hostname RabbitMQ存储数据的节点名称,默认是主机名,不指定更改主机名启动失败,默认路径/var/lib/rabbitmq/mnesia -p 指定宿主机和容器端口映射(5672:服务应用端口,15672:管理控制台端口)
1317 0
|
消息中间件 Docker 容器
Docker安装ActiveMQ
Docker安装ActiveMQ步骤
7738 0
|
SQL 关系型数据库 数据库
7 款常用的 PostgreSQL GUI 工具测评
PostgreSQL 本身附带一个名为 psql 的内置 CLI,但有些人不喜欢通过命令行编写查询。本篇文章,码匠列举和介绍了可用于查询、可视化与分析 PostgreSQL 数据的 GUI 工具。
12785 1
7 款常用的 PostgreSQL GUI 工具测评
|
C# C++
C# WPF 左侧菜单右侧内容布局效果实现
原文:C# WPF 左侧菜单右侧内容布局效果实现 我们要做的效果是这样的,左侧是可折叠的菜单栏,右侧是内容区域,点击左侧的菜单项右侧内容区域则相应地切换。 wpf实现的话,我的办法是用一个tabcontrol,修改tabcontrol的样式模板,首先将控件的TabStripPlacement设置为left使tabcontrol的item header部分靠左内容靠右,然后用一个Expander将TabPanel包住实现可折叠菜单效果,最后就是把用到的控件样式修改一下即可。
5088 0
|
Web App开发 C#
C# .NET 根据Url链接保存Image图片到本地磁盘
原文:C# .NET 根据Url链接保存Image图片到本地磁盘 根据一个Image的Url链接可以在浏览器中显示一个图片,如果要通过代码将图片保存在本地磁盘可以通过以下方式: 1、首先获取图片的二进制数组。
2519 0
|
SQL 监控 关系型数据库
|
关系型数据库 MySQL 数据库
Mysql纯命令行添加用户
创建用户: 命令: 1 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username – 你将创建的用户名, host – 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,  如果想让该用户可以从任意远程主机登陆,可以使用通
1349 0