看了好久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);
}
}