仿ios的滑动效果

package code.suibianchou.com.custormview2;

import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Rect;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.TranslateAnimation;import android.widget.ScrollView;

/** * Created by Administrator on 2017/5/18 0018. */

public class BounceScrollView extends ScrollView {    private static final String TAG = "BounceScrollView";

private View inner;// 孩子View

private float y;// 点击时y坐标

private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.)

private boolean isCount = false;// 是否开始计算    private float lastX = 0;    private float lastY = 0;    private float currentX = 0;    private float currentY = 0;    private float distanceX = 0;    private float distanceY = 0;    private boolean upDownSlide = false; //判断上下滑动的flag

public BounceScrollView(Context context, AttributeSet attrs) {        super(context, attrs);    }

/***     * 根据 XML 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate     * 方法,也应该调用父类的方法,使该方法得以执行.     */    @SuppressLint("MissingSuperCall")    @Override    protected void onFinishInflate() {        if (getChildCount() > 0) {            inner = getChildAt(0);            View view;        }    }

@Override    public boolean dispatchTouchEvent(MotionEvent ev) {        // TODO Auto-generated method stub

currentX = ev.getX();        currentY = ev.getY();        switch(ev.getAction()){            case MotionEvent.ACTION_DOWN:

break;            case MotionEvent.ACTION_MOVE:                distanceX = currentX - lastX;                distanceY = currentY - lastY;                if(Math.abs(distanceX)<Math.abs(distanceY) && Math.abs(distanceY)>12){

upDownSlide = true;                }                break;            case MotionEvent.ACTION_UP:

break;            default:                break;        }        lastX = currentX;        lastY = currentY;        if (upDownSlide && inner != null) commOnTouchEvent(ev);        return super.dispatchTouchEvent(ev);    }

@Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        // TODO Auto-generated method stub        return super.onInterceptTouchEvent(ev);    }

/***     * 监听touch     */    @Override    public boolean onTouchEvent(MotionEvent ev) {        return super.onTouchEvent(ev);    }

/***     * 触摸事件     *     * @param ev     */    public void commOnTouchEvent(MotionEvent ev) {        int action = ev.getAction();        switch (action) {            case MotionEvent.ACTION_DOWN:                break;            case MotionEvent.ACTION_UP:                // 手指松开.                if (isNeedAnimation()) {                    animation();                    isCount = false;                }                clear0();                break;            case MotionEvent.ACTION_MOVE:                final float preY = y;// 按下时的y坐标                float nowY = ev.getY();// 时时y坐标                int deltaY = (int) (preY - nowY);// 滑动距离                if (!isCount) {                    deltaY = 0; // 在这里要归0.                }

y = nowY;                // 当滚动到最上或者最下时就不会再滚动,这时移动布局                if (isNeedMove()) {                    // 初始化头部矩形                    if (normal.isEmpty()) {                        // 保存正常的布局位置                        normal.set(inner.getLeft(), inner.getTop(),                                inner.getRight(), inner.getBottom());                    }                    // 移动布局                    inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,                            inner.getRight(), inner.getBottom() - deltaY / 2);                }                isCount = true;                break;

default:                break;        }    }

/***     * 回缩动画     */    public void animation() {        // 开启移动动画        TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),                normal.top);        ta.setDuration(200);        inner.startAnimation(ta);        // 设置回到正常的布局位置        inner.layout(normal.left, normal.top, normal.right, normal.bottom);

normal.setEmpty();

}

// 是否需要开启动画    public boolean isNeedAnimation() {        return !normal.isEmpty();    }

/***     * 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度     *     * getHeight():获取的是屏幕的高度     *     * @return     */    public boolean isNeedMove() {        int offset = inner.getMeasuredHeight() - getHeight();        int scrollY = getScrollY();        // 0是顶部,后面那个是底部        if (scrollY == 0 || scrollY == offset) {            return true;        }        return false;    }

private void clear0(){        lastX = 0;        lastY = 0;        distanceX = 0;        distanceY = 0;        upDownSlide = false;    }}
时间: 2024-08-29 22:30:36

仿ios的滑动效果的相关文章

android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题

一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相!现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; i

ANDROID仿IOS微信滑动删除_SWIPELISTVIEW左滑删除例子

http://dwtedx.sinaapp.com/itshare_290.html 本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除的功能.在Android上面实现比较麻烦.本例子中不仅实现了左滑删除功能.还实现了左滑赞.左滑分享.左滑收藏等功能.当然大家也可以根据自己项目的需求来修改功能.QQ和微信也实现了相同的功能.大家可以看看.先上程序运行的效果 怎么样.大家看了这个截图是不是很心动呀.而且在左滑的时候还配有简单的滑动动画呢.非

Android -- 仿ios上下反弹效果

1,前几天在一个app上看到了滑动反弹效果,觉得这个效果挺不错的,然后想自己来实现一下,在网上查了一下基本上都是大致的说了下思路,自己看了一下,决定把实现的思路来详细的写下来,先看一下我们实现的效果吧. 可以看出这个使我们自定义的ScrollView,通过两次判断(头部.底部)来将动态的将ScrollView里面的View向下平移,大体的思路就是这样,下面直接把代码贴出来了 ,包括实现的步骤和一些重要代码都写了注释了 package com.qianmo.myview2.view; /** *

[Android-2A] -仿IOS微信滑动删除_SwipeListview左滑删除例子

https://yunpan.cn/cueUIQkRafQrH (提取码:7ec1) 关于这样类似的例子网上的代码很多,最近发现这个例子里的代码在开发中会遇到一系列的问题.比如ListView的OnItemClickListener中无法获取在AppAdapter中getView方法convertView setTag的数据,所以需要优化下. 原因是控件中的SwipeMenuAdapter对Listview中的条目进行了修改和再封装. 具体优化的思路为,将控件中的SwipeMenuAdapter

在uwp仿IOS的页面切换效果

有时候我们需要编写一些迎合IOS用户使用习惯的uwp应用,我在这里整理一下仿IOS页面切换效果的代码. 先分析IOS的页面切换.用户使用左右滑动方式进行前进和后退,播放类似于FlipView的切换动画.导航到新页面时,使用页面前进的动画. UWP自带很多切换效果,位于 Windows.UI.Xaml.Media.Animation 中.与苹果的切换效果最接近的是 PaneThemeTransition (而不是EdgeUIThemeTransition). PaneThemeTransition

Android仿IOS回弹效果 ScrollView回弹 总结

Android仿IOS回弹效果  ScrollView回弹 总结 应项目中的需求  需要仿IOS 下拉回弹的效果 , 我在网上搜了很多 大多数都是拿scrollview 改吧改吧 试了一些  发现总有点小问题 下面的代码是我对大家发布的做了点小修改   觉得没太大问题 package com.example.myscrollview; import android.content.Context; import android.graphics.Rect; import android.util

android仿系统Launcher界面,实现分屏,左右滑动效果(ViewSwitcher)

ViewSwitcher代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果. 为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创建View 即可. 下面通过一个实例来介绍 ViewSwitcher的用法.(仿Android系统L

&#8203;android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果

项目已经从git上独立出来,各个效果已经分好类别,页面new调用就可以了,不会卡顿. 效果如下图: ​android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果

iOS仿今日头条滑动导航

之前写了篇博客网易首页导航封装类.网易首页导航封装类优化,今天在前两个的基础上仿下今日头条. 1.网易首页导航封装类中主要解决了上面导航的ScrollView和下面的页面的ScrollView联动的问题,以及上面导航栏的便宜量. 2.网易首页导航封装类优化中主要解决iOS7以上滑动返回功能中UIScreenEdgePanGestureRecognizer与ScrollView的滑动的手势冲突问题. 今天仿今日头条滑动导航和网易首页导航封装类优化相似,这个也是解决手势冲突,UIPanGesture