图片会跟随手指移动,只有是下滑时才会退出查看页面,其他情况会复位,直接当做ImageView使用即可,setViewCall方法是在下滑完成后要执行的操作,上,左,右,可自行扩展

onTouchEvent 监听手指坐标,GestureDetector 监听滑动的惯性,ViewHelper设置图片位移动画

public class FriendCircleView extends android.support.v7.widget.AppCompatImageView implements GestureDetector.OnGestureListener {public FriendCircleView(Context context) {super(context);initView(context, null, 0);}public FriendCircleView(Context context, AttributeSet attrs) {super(context, attrs);initView(context, attrs, 0);}public FriendCircleView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context, attrs, defStyleAttr);}//设置滑动完成后的回调方法public void setViewCall(FriendCircleViewCall viewCall) {this.viewCall = viewCall;}private void initView(Context context, AttributeSet attrs, int defStyleAttr) {screenHeight = ScreenUtils.getScreenHeight(context);detector = new GestureDetector(context, this);}private GestureDetector detector;private int screenHeight;//设备屏幕高度private float oldX, oldY;//手机放在屏幕的坐标private float movY;//移动中在屏幕上的坐标private float alphaPercent = 1f;//背景颜色透明度private boolean isFinsh = false;//是否执行关闭页面的操作private FriendCircleViewCall viewCall = null;@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouchEvent(MotionEvent event) {detector.onTouchEvent(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:oldX = event.getRawX();oldY = event.getRawY();break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:if (isFinsh) {isFinsh = false;if (viewCall != null) {viewCall.viewDestry();}Log.e("ldd------", "页面返回");} else {setupUping();Log.e("ldd------", "手指抬起");}break;case MotionEvent.ACTION_MOVE:isFinsh = false;float movX = event.getRawX() - oldX;movY = event.getRawY() - oldY;setupMoving(movX, movY);if (Math.abs(movX) > Math.abs(movY)) {if (movX < 0) {Log.e("ldd------", "左滑动");} else {Log.e("ldd------", "右滑动");}} else {if (movY < 0) {Log.e("ldd------", "上滑动");} else {if (movY > (screenHeight / 6)) {isFinsh = true;Log.e("ldd------", "下滑动");}}}return false;}return true;}private void setupUping() {animate().setDuration(200).scaleX(1).scaleY(1).translationX(0).translationY(0).setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {if (alphaPercent < animation.getAnimatedFraction()) {((ViewGroup) getParent()).setBackgroundColor(convertPercentToBlackAlphaColor(animation.getAnimatedFraction()));}}}).start();}private void setupMoving(float deltaX, float deltaY) {if (Math.abs(movY) < (screenHeight / 4)) {float scale = 1 - Math.abs(movY) / screenHeight;alphaPercent = 1 - Math.abs(deltaY) / (screenHeight / 2);ViewHelper.setScaleX(this, scale);ViewHelper.setScaleY(this, scale);((ViewGroup) getParent()).setBackgroundColor(convertPercentToBlackAlphaColor(alphaPercent));}ViewHelper.setTranslationX(this, deltaX);ViewHelper.setTranslationY(this, deltaY);}//设置背景颜色透明度protected int convertPercentToBlackAlphaColor(float percent) {percent = Math.min(1, Math.max(0, percent));int intAlpha = (int) (percent * 255);String stringAlpha = Integer.toHexString(intAlpha).toLowerCase();String color = "#" + (stringAlpha.length() < 2 ? "0" : "") + stringAlpha + "000000";return Color.parseColor(color);}@Overridepublic boolean onDown(MotionEvent e) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onSingleTapUp(MotionEvent e) {isFinsh = true;return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {return false;}@Overridepublic void onLongPress(MotionEvent e) {}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {float movX = e2.getRawX() - e1.getRawX();float movY = e2.getRawY() - e1.getRawY();Log.e("ldd------2", movX + "---------" + movY);if (Math.abs(movX) > Math.abs(movY)) {if (movX < 0) {Log.e("ldd------2", "左滑动");} else {Log.e("ldd------2", "右滑动");}} else {if (movY < 0) {Log.e("ldd------2", "上滑动");} else {isFinsh = true;Log.e("ldd------2", "下滑动");}}return true;}public interface FriendCircleViewCall {void viewDestry();}
}

Android开发下拉关闭图片相关推荐

  1. [安卓开发] 下拉框Spinner与适配器ArrayAdapter/SimpleAdapter的使用

    目录 简单介绍Spinner和Adapter ArrayAdapter实现以对话框形式展示下拉框(纯文字) Simple实现以对话框形式展示下拉框(图片加文字) 简单介绍Spinner和Adapter ...

  2. css下拉点击不动,CSS3 - 进行简单的点击下拉[关闭](CSS3 - Making a simple click-dropdown [closed])...

    CSS3 - 进行简单的点击下拉[关闭](CSS3 - Making a simple click-dropdown [closed]) 有人可以帮助我使用与此页面相同的下拉列表的代码吗? 我想做同样 ...

  3. 安卓美化——添加下拉菜单图片或下拉菜单透明

    想必下拉菜单有一个背景图片会让人觉得特酷的感觉~ 具体的过程不难: 1.反编译SystemUI.apk(如何反编译请戳:http://blog.csdn.net/u012336923/article/ ...

  4. 仿QQ空间,百思不得姐下拉刷新图片放大

    1.概述 实习生进阶到项目部分会带他们做一个百思不得姐项目,那么个人主页就有类似于QQ空间下拉图片放大的效果,趁着现在还闲就实现一下效果: 2.实现 1. 效果分析 ScrollView和ListVi ...

  5. Xamarin. Android实现下拉刷新功能

    PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...

  6. android listview下拉刷新动画,android 安卓 listview 支持下拉刷新 上拉加载更多

    [1]重写listViewimport java.text.SimpleDateFormat; import java.util.Date; import com.example.testdddlea ...

  7. 【SwiftUI模块】0012、SwiftUI-搭建一个类似微博、网易云、抖音个人页面的头部下拉放大图片效果

    SwiftUI模块系列 - 已更新11篇 SwiftUI项目 - 已更新1个项目 往期Demo源码下载 技术:SwiftUI.SwiftUI3.0.下拉放大.tableview粘性头部.头部下拉放大图 ...

  8. android代码下拉刷新页面,Android下拉刷新的实现

    ListView下拉刷新实现方式分析 1.添加顶部下拉加载界面. 2.监听onScrollListener,来判断当前是否在ListView最顶部. 3.监听onTouch事件,根据手势变化改变当前状 ...

  9. android菜单回弹,Android ScrollLayout 下拉回弹

    Android ScrollLayout 下拉回弹 import android.content.Context; import android.graphics.PointF; import and ...

最新文章

  1. 重载和覆盖的区别?(overload vs override)
  2. STM32 电机教程 1 - 用ST Motor Profiler 测量无刷电机参数
  3. Android 4.4(KitKat)中的设计模式-Graphics子系统
  4. oracle创建表不在对应表空间,oracle创建表空间
  5. mysql 浮点型详解 简书_MySQL数据类型;基本操作
  6. raft算法_学习分布式一致性协议:自己实现一个Raft算法
  7. 联想记忆计算机网络,联想记忆网络,associative memory network,音标,读音,翻译,英文例句,英语词典...
  8. 我真的还是18岁的那个我
  9. 磁带机故障灯解决方法
  10. 导航栏的HTML的布局方式
  11. 无偏估计的数学证明和分析
  12. Linux/debian/ubuntu/deepin 等系统禁用鼠标中键(滚轮)按下粘贴的方法
  13. SDN跟网络虚拟化的完美结合
  14. GNSS 使用DFT算法 能量损耗仿真
  15. web 前端签名插件_signature_pad插件实现电子签名功能
  16. 高等学校计算机水平考试分值,请问计算机二级ps的考试题型和分值是怎样的?...
  17. 360 || 2021校园招聘的一道笔试题思路分享
  18. dll与exe的区别
  19. 将json对象转换为数组,获取json对象的属性值
  20. 雨量预警广播自动化数据平台BWII 型广播预警监测仪

热门文章

  1. 3080猛禽和tuf的区别
  2. cpu温度过高 ubuntu_如何在Ubuntu Linux中检查CPU温度
  3. 这位人力HR总监的数据分析能力,太牛了!大多数人根本没有
  4. 一行代码下载优酷、腾讯、B站等公开视屏
  5. FANUC仿真安装指导
  6. html移除背景颜色,拆分背景颜色HTML
  7. 【Matlab 六自由度机器人】定义标准型及改进型D-H参数建立机器人模型(附MATLAB建模代码)
  8. 做什么都要形成自己的库,这样测试起来就能一气呵成
  9. android 自己调用系统相机保存的照片存到自定义文件夹里面用电脑看该照片显示0KB或者是无法查看?或者说用手机助手导出照片导出失败?
  10. 【Web前端】标签大全HTML/CSS/JavaScript