有弹性的ScrollView_setmovefactor-程序员宅基地

技术标签: android开发  android  boundScrollView  

我是个新手,虽然说现在这已经算是过时的效果,但是我还是要学会到底是怎么实现的,于是我把我之前看到的,别人实现的半成品,拿过来搞懂了之后,复写了一遍,然后添加了可以左右弹性移动的部分。然后添加了几个getter/setter

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

public class BoundBackScrollView extends ScrollView {

    /**
     * original child
     * the content view to be moved
     */
    private View contentView;

    /**
     * used to save content view's left/right/top/bottom values
     */
    private Rect rect = new Rect();

    /**
     * move factor(if you move 100xp then the content view
     * will move 50xp, if you change the move factor to 1f
     * then will move 100xp)
     */
    private float MoveFactor = 0.5f;

    /**
     * animation duration
     * the length of time bound back animation
     */
    private int AnimDuration = 300;

    /**
     * is content view moved
     */
    private boolean IsMoved = false;

    /**
     * the start position
     */
    private float startY;
    private float startX;

    /**
     * bound mode
     */
    public enum BOUND_MODE{
        UPDOWN,
        LEFTRIGHT,
        BOTH
    }

    /**
     * default mode
     */
    private BOUND_MODE boundMode = BOUND_MODE.UPDOWN;


    public BoundBackScrollView(Context context) {
        super(context);
    }

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

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        if (getChildCount() > 0) {
            contentView = getChildAt(0);
        }
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (contentView == null)
            return;
        rect.set(contentView.getLeft(), contentView.getTop(),
                contentView.getRight(), contentView.getBottom());
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        if (contentView == null) {
            return super.dispatchTouchEvent(ev);
        }

        boolean isTouchOutOfThis = ev.getX() >= this.getWidth()
                || ev.getX() <= 0
                || ev.getY() >= this.getHeight()
                || ev.getY() <= 0;

        if (isTouchOutOfThis) {
            if (IsMoved) {
                boundBack();
            }
            return true;
        }

        int action = ev.getAction();
        switch (action) {

            case MotionEvent.ACTION_DOWN:
                startX = ev.getX();
                startY = ev.getY();
                break;

            case MotionEvent.ACTION_MOVE: //会被循环调用


                int deltaY = (int) (ev.getY() - startY);
                int deltaX = (int) (ev.getX() - startX);
                boolean shouldMove = deltaY > 0 || deltaX > 0;

                if (shouldMove) {
                    int offsetY = (int) (deltaY * MoveFactor);
                    int offsetX = (int) (deltaX * MoveFactor);
                    if(boundMode == BOUND_MODE.UPDOWN)
                    {
                        contentView.layout(rect.left, rect.top + offsetY,
                                rect.right, rect.bottom + offsetY);

                    }else if(boundMode == BOUND_MODE.LEFTRIGHT)
                    {
                        contentView.layout(rect.left + offsetX, rect.top,
                                rect.right + offsetX, rect.bottom);
                    }else{
                        contentView.layout(rect.left + offsetX, rect.top + offsetY,
                                rect.right + offsetX, rect.bottom + offsetY);
                    }

                    IsMoved = true;
                }

                break;

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                boundBack();
                break;

        }
        return super.dispatchTouchEvent(ev);
    }

    private void boundBack() {
        if (!IsMoved)
            return;
        TranslateAnimation anim = null;
        if(boundMode == BOUND_MODE.UPDOWN) {
            anim = new TranslateAnimation(0, 0, contentView.getTop(),
                    rect.top);
        }else if(boundMode == BOUND_MODE.LEFTRIGHT){
            anim =  new TranslateAnimation(contentView.getLeft(), rect.left, 0,
                    0);
        }else{
            anim =  new TranslateAnimation(contentView.getLeft(), rect.left, contentView.getTop(),
                    rect.top);
        }
        anim.setDuration(AnimDuration);

        contentView.startAnimation(anim);
        contentView.layout(rect.left, rect.top, rect.right, rect.bottom);
        IsMoved = false;
    }


    public void setMoveFactor(float moveFactor){
        this.MoveFactor = moveFactor;
    }

    public float getMoveFactor(){
        return MoveFactor;
    }

    public void setAnimDuration(int AnimDuration){
        this.AnimDuration = AnimDuration;
    }

    public int getAnimDuration(){
        return AnimDuration;
    }

    public void setBoundMode(BOUND_MODE boundMode){
        this.boundMode = boundMode;
    }

    public BOUND_MODE getBoundMode(){
        return boundMode;
    }
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010911576/article/details/43379645

智能推荐

C/C++中CRT_c++ crt-程序员宅基地

文章浏览阅读4.1k次,点赞5次,收藏15次。本文转载自http://blog.sina.com.cn/s/blog_149e9d2ec0102wyvq.htmlCRT原先是指Microsoft开发的C Runtime Library,用于操作系统的开发及运行。后来在此基础上开发了C++ Runtime Library,所以现在CRT是指Microsoft开发的C/C++ Runtime Library。在VC的CRT/SRC目录下,可以..._c++ crt

C语言作业(四)-程序员宅基地

文章浏览阅读70次。【代码】C语言作业(四)

JavaScript语法高亮库highlight.js使用_语法高亮js css文件-程序员宅基地

文章浏览阅读9.9k次。highlight.js是一款基于JavaScript的语法高亮库,目前支持125种编程语言,有63种可供选择的样式,而且能够做到语言自动识别,和目前主流的JS框架都能兼容,可以混合使用。这款高亮库可以用在博客系统中,其使用方法及其简单,几乎不需要任何学习成本,下面介绍highlight.js的使用。1.获取highlight.js库,用户可以从官网获取:地址:https://highlightjs_语法高亮js css文件

【笔记】strftime的使用方法-程序员宅基地

文章浏览阅读5.1k次。strftimestrftime是C语言标准库中用来格式化输出时间的的函数。下面是strftime的用法各参数意义代码使用示例#include<stdio.h>#include<time.h>#define print(s1, s2,s3) \ printf("%-20s%-30s%s\n",s1, s2,s3);int main(){ time_t rawtime; struct tm* timeinfo; char timE[80]; /

2018.09.12 poj3621Sightseeing Cows(01分数规划+spfa判环)-程序员宅基地

文章浏览阅读147次。传送门 01分数规划板题啊。 发现就是一个最优比率环。 这个直接二分+spfa判负环就行了。 代码:#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;cstring&gt;#include&lt;algorithm&gt;#include&lt;cmath&gt;#define N 1005#define...

hive sql的常用日期处理函数总结_hive sql 日期函数-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏14次。1)date_format函数(根据格式整理日期)  作用:把一个字符串日期格式化为指定的格式。select date_format('2017-01-01','yyyy-MM-dd HH:mm:ss'); --日期字符串必须满足yyyy-MM-dd格式   结果:2017-01-01 00:00:002)date_add、date_sub函数(加减日期)  作用:把一个字符串日期格式加一天、减一天。select date_add('2019-01-01',1); ..._hive sql 日期函数

随便推点

探索Camera2Demo:一款深入理解Android Camera2 API的开源示例项目-程序员宅基地

文章浏览阅读267次,点赞5次,收藏9次。探索Camera2Demo:一款深入理解Android Camera2 API的开源示例项目项目地址:https://gitcode.com/wangshengyang1996/Camera2Demo项目简介Camera2Demo 是一个由wangshengyang1996开发并维护的Android应用示例,旨在帮助开发者更好地理解和使用Android的Camera2 API。该项目通过提供..._android camera2 demo

iOS10 适配、Xcode8配置总结①-程序员宅基地

文章浏览阅读121次。2019独角兽企业重金招聘Python工程师标准>>> ...

微信API证书过期,获取API证书_微信 apiv3证书 过期-程序员宅基地

文章浏览阅读10w+次。在做微信如:(退款、企业红包、企业付款)提现这些操作的时候,微信返回(具体哪个字段我忘记了)的信息是:证书过期,那么就需要重新获取证书,证书的获取前提条件:1:你需要有微信商户平台的商户号(类似电话号码的数字),和商户名称(比如公司名称)2:按照官方说明文档进行相应操作即可(按照这个做就行了)http://kf.qq.com/faq/161222NneAJf161222U7fARv.h..._微信 apiv3证书 过期

雷达探测项目仿真代码(Matlab代码实现)_探地雷达成像matlab-程序员宅基地

文章浏览阅读2.2k次。雷达探测是电磁威慑的重要组成。国外发达国家正从体系、平台、频段、架构、硬件、处理等方面开发新一代雷达技术。针对高超声速目标、弹道导弹、无人集群目标、隐身飞机等新型极高速、极隐身、极庞大目标,将以网络为基础,整合各类探测手段,实现对目标的全球预警、全程连续跟踪、全维协同精确打击,形成全域全时全维的体系化探测感知能力。对深空目标、临空目标、隐身目标、集群目标的探测研究新型威胁目标是驱动雷达探测技术前进的原动力之一,而新时期的新型威胁目标呈现“高、低、快、慢、小、隐、群”等特征。_探地雷达成像matlab

kali 安装取证工具volatility_kali安装volatility-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏12次。计算机取证 volatility_kali安装volatility

html禁止图片缓存(刷新网站)_html禁止浏览器缓存图片-程序员宅基地

文章浏览阅读2.1k次。地址:https://blog.csdn.net/fareast_mzh/article/details/81464031_html禁止浏览器缓存图片

推荐文章

热门文章

相关标签