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 {
}
在这有个不明白的问题,以前看的书上是在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);
}
}
看下代码:
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); }
}
相关文章推荐
- Android-86需 在如下几个方向做提升
- android studio打jar包
- Android 四大核心组件之Activity
- 源码解析Android中View的measure量算过程
- Android-彻底理解文件存储
- assets文件夹资源的访问
- 阅读《Android 从入门到精通》(20)——图片视图
- assets文件夹资源的访问
- Android的消息循环机制 Looper Handler类分析
- Android ToolBar 基本使用
- android键盘监听方案
- Android 自定义View之柱状图实践
- android notification 使用
- android 处理图片之--bitmap处理
- Android6.0 按键流程(五)无线鼠标右键无效 -- hal层
- 【MIG专项测试组】如何准确评测Android应用的流畅度?
- android listview多视图嵌套多视图
- Android-StrictMode-性能优化
- android之自定义控件
- Android框架模式之MVC与MVP