您的位置:首页 > 移动开发 > Android开发

android 弹性ScrollView

2016-02-01 14:44 423 查看
看了好久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 {

[code]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);

}

[code]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);
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: