Android 按钮按下释放水纹实现
来源:互联网 发布:js json双引号转义 编辑:程序博客网 时间:2024/06/03 07:22
Android 按钮按下水纹。
import android.content.Context;import android.os.Message;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.DecelerateInterpolator;import android.view.animation.ScaleAnimation;import android.widget.ImageView;import java.util.Iterator;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class ButtonTouchCircleAnimView extends ViewGroup { private static final int HANDLER_START_UP_ANIM = 0; private static final int HANDLER_UP_ANIM_END = 1; private Context mContext; private ConcurrentHashMap<Integer, CircleView> mCircleViewMap; private int mCircleRadius; private WeakRefHandler mHandler; public ButtonTouchCircleAnimView(Context context) { this(context, null); } public ButtonTouchCircleAnimView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; mCircleViewMap = new ConcurrentHashMap<>(); mCircleRadius = (int) (mContext.getResources().getDimension(R.dimen.bottom_menu_bar_height) + DensityUtils.dip2px(mContext, 12)) / 2; mHandler = new WeakRefHandler(mContext) { @Override public void handleMessage(Message msg) { CircleView circleView = null; switch (msg.what) { case HANDLER_START_UP_ANIM: int id = (int) msg.obj; circleView = mCircleViewMap.get(id); if (null != circleView && null != circleView.imageView) { circleView.imageView.clearAnimation(); circleView.imageView.startAnimation(new TouchUpAnimation(id).create()); } break; case HANDLER_UP_ANIM_END: id = (int) msg.obj; circleView = mCircleViewMap.get(id); if (null != circleView && null != circleView.imageView) { if (!circleView.downAnimRuning) { circleView.imageView.clearAnimation(); removeView(circleView.imageView); mCircleViewMap.remove(id); } } break; } } }; } public class CircleView { ImageView imageView; View mRelatedView; boolean downAnimRuning = false; boolean upAnimRuning = false; boolean upAnimWaiting = false; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { } public ImageView createCircleView() { ImageView iv = new ImageView(mContext); iv.setImageResource(R.drawable.button_touch_circle_shape); return iv; } public void onButtonTouch(View v, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_DOWN) { CircleView circleView = mCircleViewMap.get(v.getId()); if (circleView == null) { circleView = new CircleView(); circleView.imageView = createCircleView(); circleView.mRelatedView = v; mCircleViewMap.put(v.getId(), circleView); int left = v.getLeft() + v.getWidth() / 2 - mCircleRadius; int top = v.getTop() + v.getHeight() / 2 - mCircleRadius; int right = v.getRight() - v.getWidth() / 2 + mCircleRadius; int bottom = v.getBottom() - v.getHeight() / 2 + mCircleRadius; addView(circleView.imageView); circleView.imageView.layout(left, top, right, bottom); } circleView.upAnimWaiting = false; circleView.upAnimRuning = false; circleView.downAnimRuning = true; circleView.imageView.clearAnimation(); circleView.imageView.startAnimation(new TouchDownAnimation(v.getId()).create()); } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { if (mCircleViewMap.get(v.getId()) != null) { if (mCircleViewMap.get(v.getId()).downAnimRuning) { mCircleViewMap.get(v.getId()).upAnimWaiting = true; } else { mCircleViewMap.get(v.getId()).imageView.clearAnimation(); mCircleViewMap.get(v.getId()).imageView.startAnimation(new TouchUpAnimation(v.getId()).create()); } } } } private class TouchDownAnimation { private int viewId = 0; public TouchDownAnimation(int id) { viewId = id; } public AnimationSet create() { AlphaAnimation alphaAnimation; ScaleAnimation scaleAnimation; alphaAnimation = new AlphaAnimation(0, 1); scaleAnimation = new ScaleAnimation(0, 1.0f, 0, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); AnimationSet animationSet = new AnimationSet(true); animationSet.addAnimation(alphaAnimation); animationSet.addAnimation(scaleAnimation); animationSet.setDuration(180); animationSet.setInterpolator(new DecelerateInterpolator()); animationSet.setFillAfter(true); animationSet.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { mCircleViewMap.get(viewId).downAnimRuning = true; } @Override public void onAnimationEnd(Animation animation) { if (mCircleViewMap.get(viewId) != null) { mCircleViewMap.get(viewId).downAnimRuning = false; boolean processTheRelatedViewDisabled = !(mCircleViewMap.get(viewId).mRelatedView == null || mCircleViewMap.get(viewId).mRelatedView.isEnabled()); if (mCircleViewMap.get(viewId).upAnimWaiting || processTheRelatedViewDisabled) { mCircleViewMap.get(viewId).upAnimWaiting = false; mHandler.sendMessage(mHandler.obtainMessage(HANDLER_START_UP_ANIM, viewId)); } } } @Override public void onAnimationRepeat(Animation animation) { } }); return animationSet; } } private class TouchUpAnimation { private int viewId = 0; public TouchUpAnimation(int id) { viewId = id; } public AnimationSet create() { AlphaAnimation alphaAnimation; ScaleAnimation scaleAnimation; alphaAnimation = new AlphaAnimation(1, 0); scaleAnimation = new ScaleAnimation(1.f, 2.f, 1.f, 2.f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); AnimationSet animationSet = new AnimationSet(true); animationSet.addAnimation(alphaAnimation); animationSet.addAnimation(scaleAnimation); animationSet.setDuration(400); animationSet.setInterpolator(new DecelerateInterpolator()); animationSet.setFillAfter(true); animationSet.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { mCircleViewMap.get(viewId).upAnimRuning = true; } @Override public void onAnimationEnd(Animation animation) { if (mCircleViewMap.get(viewId) != null) { mCircleViewMap.get(viewId).upAnimRuning = false; mHandler.sendMessage(mHandler.obtainMessage(HANDLER_UP_ANIM_END, viewId)); } } @Override public void onAnimationRepeat(Animation animation) { } }); return animationSet; } } public void abortAnimation(int viewId) { if (mCircleViewMap.get(viewId) != null) { if (null != mHandler) { mHandler.removeMessages(HANDLER_START_UP_ANIM, viewId); mHandler.removeMessages(HANDLER_UP_ANIM_END, viewId); } mCircleViewMap.get(viewId).imageView.clearAnimation(); removeView(mCircleViewMap.get(viewId).imageView); mCircleViewMap.remove(viewId); } } public void abortAllAnimation() { Iterator iter = mCircleViewMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Integer key = (Integer) entry.getKey(); abortAnimation(key); } }}
阅读全文
0 0
- Android 按钮按下释放水纹实现
- Android 5.0 Button 按钮水纹效果的适配问题
- Android 按钮按下效果实现
- 点击按钮有水纹效果~~
- Android实现QQ拖拽效果和向下兼容水纹效果
- WPF 实现水纹效果
- Android水纹波浪动画
- 错误 请再次按下快门释放按钮
- Android 代码实现按钮 按下弹起事件
- Android按钮按下的时候改变颜色实现方法
- Android实现两次按下返回按钮后退出应用程序
- Android按钮按下的时候改变颜色实现方法
- 安卓 单击按钮出现水纹特效
- 用python实现水纹特效
- android 按钮按下效果
- Android 如何实现圆形水纹状进度?类似360的,具体看图,求大神帮帮忙!
- Unity 实现按下按钮替换按钮的图片
- C#实现的水纹特效例子
- servlet的url-pattern匹配规则详细描述
- ucos-iii学习之ucos-iii的特性
- Elasticsearch Reference 5.5 中文翻译5
- Android面试-2017
- python实现自动查找并使用空闲GPU
- Android 按钮按下释放水纹实现
- 【学习摘记】马士兵Servlet&JSP_课时29_servlet_forward——JSP内置对象以及与servlet之间的跳转
- mybatis别名
- 奇偶放规则
- [201]一步一步学懂Spring
- 【Android笔记-异常-4】定义一个临时的数组变量承接数据,ListView的数据以及通知数据更新要放到同一个线程(主线程)。避免出现异常"The content of the adapter
- 参数(parameter)和属性(Attribute)的区别
- ROW_NUMBER() OVER函数的基本用法
- No module named nmap