android 弹性ScrollView

看了好久hy老师的博客,自己也总结了一些学到的知识,前些天写了一个弹性ScrolView,主要就是用到了一些手势动作,无非就是onTouchEvent里的三种情况,actiondown,actionmove,actionup,很简单,但是也学习到不少东西,慢慢的积累才会有大的进步。
看下代码:
package view;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;

/**
* Created by Alwasy on 2016/1/27.
*/
public class MyScrolView extends ScrollView {

private View mView;
private int distance;
private int right;
private int bottom;
//第一次滑动的时候会有bug,原因不明,从第二次开始计算
boolean isFirst = true;

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

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

public MyScrolView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

int y;

/**
 * 本方法只有在初始化的时候执行,拿到初始化完状态下的数据
 *
 * @param changed
 * @param l
 * @param t
 * @param r
 * @param b
 */
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    if (getChildCount() > 0) {
        mView = getChildAt(0);
        right = mView.getRight();
        bottom = mView.getBottom();
    }

}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (y == -1) {
        y = (int) ev.getY();
    }
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_MOVE:
            int cy = (int) ev.getY();
            Log.d("MOVE的值: ", cy + "");
            if (y == -1) {
                y = (int) ev.getY();
            }
            int distance = cy - y;
            if (isFirst) {
                distance = 0;
                isFirst = false;
            }
            y = cy;
            //重新安置mview的位置
            mView.layout(mView.getLeft(), mView.getTop() + 2 * distance / 3, mView.getRight(), mView.getBottom() + 2 * distance / 3);
            break;
        case MotionEvent.ACTION_UP:
            Log.d("getScrollY: ", mView.getTop() + "  getHeight() / 2: " + getHeight() / 2);
            if (mView.getTop() > getHeight() / 2) {
                if (setToActivityListener != null) {
                    setToActivityListener.ToActivity();
                }
            }
            y = -1;
            restore();
            break;
    }
    return super.onTouchEvent(ev);
}


/**
 * 松开返回的动画
 */
public void restore() {
    Animation animation = new TranslateAnimation(0, 0, mView.getTop(), 0);
    animation.setFillAfter(true);
    animation.setDuration(200);
    mView.startAnimation(animation);
    mView.layout(0, 0, right, bottom);
}

public void setToActivity(setToActivityListener setToActivityListener) {
    this.setToActivityListener = setToActivityListener;
}

private setToActivityListener setToActivityListener;
//滑动处理接口,可以自己搞些别的事
public interface setToActivityListener {
    void ToActivity();
}

}

在这有个不明白的问题,以前看的书上是在actionmove的时候会包括一次actiondown但是 我在这却获取不到,不知道怎么回事,随着知识越积越多,相信会慢慢搞懂的,加油!

下面是listveiw需要做一些处理,不然会挤在一起的,显示的高度,并不是我们所希望的,需要做:
package view;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

import static android.view.View.MeasureSpec.makeMeasureSpec;

/**
* Created by Alwasy on 2016/1/27.
*/
public class MyListView extends ListView {
public MyListView(Context context) {
super(context);
}

public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

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

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//这里就是根据32位,其中高2位代表的模式也就是后面的at_most,低30位代表的是大小,安卓内部已经帮我们定义好了,Integer.MAX_VALUE代表  0x7FFFFFFF    然后右移两位 低30位就是最大值了
    int spec = makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, spec);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值