android list弹性滑动 2.3以下的实现 的两个方法 (备份)
来源:互联网 发布:u盘mac系统安装教程 编辑:程序博客网 时间:2024/06/06 00:34
方法一:
弹性滑动的效果比较好看。但是 在2.2以下版本中,android 本身没有实现,想要实现这中效果要自己去写
前几天在iteye上看见了一个博客给我很大的启示,于是自己动手实验了一下感觉还可以。在这里把我的源码给大家贴上让大家一起分享,希望大家也能提出更好的意见。废话不多说上源码:
1.自己些一个MyListview 继承listview 类:
- package com.wljie;
- import android.content.Context;
- import android.graphics.Rect;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.GestureDetector;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.GestureDetector.OnGestureListener;
- import android.view.animation.TranslateAnimation;
- import android.widget.ListView;
- public class MyListView extends ListView {
- private Context context;
- private boolean outBound = false;
- private int distance;
- private int firstOut;
- private static final String TAG = "wljie";
- public MyListView(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.context = context;
- Log.d(TAG, "IN 1");
- }
- public MyListView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- this.context = context;
- Log.d(TAG, "IN 2");
- }
- public MyListView(Context context) {
- super(context);
- this.context = context;
- Log.d(TAG, "IN 3");
- }
- GestureDetector gestureDetector = new GestureDetector(
- new OnGestureListener() {
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public void onShowPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- /**
- * 手势滑动的时候触发
- */
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY) {
- Log.d(TAG, "ENTER onscroll");
- int firstPos = getFirstVisiblePosition();
- int lastPos = getLastVisiblePosition();
- int itemCount = getCount();
- // outbound Top
- if (outBound && firstPos != 0 && lastPos != (itemCount - 1)) {
- scrollTo(0, 0);
- return false;
- }
- View firstView = getChildAt(firstPos);
- if (!outBound)
- firstOut = (int) e2.getRawY();
- if (firstView != null
- && (outBound || (firstPos == 0
- && firstView.getTop() == 0 && distanceY < 0))) {
- // Record the length of each slide
- distance = firstOut - (int) e2.getRawY();
- scrollTo(0, distance / 2);
- return true;
- }
- // outbound Bottom
- return false;
- }
- @Override
- public void onLongPress(MotionEvent e) {
- // TODO Auto-generated method stub
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2,
- float velocityX, float velocityY) {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public boolean onDown(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- });
- @Override
- public boolean dispatchTouchEvent(MotionEvent event) {
- Log.d(TAG, "dispatchTouchEvent");
- int act = event.getAction();
- if ((act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_CANCEL)
- && outBound) {
- outBound = false;
- // scroll back
- }
- if (!gestureDetector.onTouchEvent(event)) {
- outBound = false;
- } else {
- outBound = true;
- }
- Rect rect = new Rect();
- getLocalVisibleRect(rect);
- TranslateAnimation am = new TranslateAnimation( 0, 0, -rect.top, 0);
- am.setDuration(300);
- startAnimation(am);
- scrollTo(0, 0);
- return super.dispatchTouchEvent(event);
- }
- }
2.在main.xml 中写入
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- android:id="@+id/LinearLayout01"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <com.wljie.MyListView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/MyListView"/>
- </LinearLayout>
3.创建一个my_listitem.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- android:layout_width="fill_parent"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_height="wrap_content"
- android:id="@+id/MyListItem"
- android:paddingBottom="3dip"
- android:paddingLeft="10dip">
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- android:id="@+id/ItemTitle"
- android:textSize="30dip">
- </TextView>
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- android:id="@+id/ItemText">
- </TextView>
- </LinearLayout>
4.在Main.java中进行下一步的显示
- package com.wljie;
- import java.util.ArrayList;
- import java.util.HashMap;
- import android.app.Activity;
- import android.graphics.Rect;
- import android.os.Bundle;
- import android.view.animation.TranslateAnimation;
- import android.widget.SimpleAdapter;
- public class Main extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 绑定XML中的ListView,作为Item的容器
- MyListView list = (MyListView) findViewById(R.id.MyListView);
- // 生成动态数组,并且转载数据
- ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
- for (int i = 0; i < 30; i++) {
- HashMap<String, String> map = new HashMap<String, String>();
- map.put("ItemTitle", "This is Title.....");
- map.put("ItemText", "This is text.....");
- mylist.add(map);
- }
- // 生成适配器,数组===》ListItem
- SimpleAdapter mSchedule = new SimpleAdapter(this, // 没什么解释
- mylist,// 数据来源
- R.layout.my_listitem,// ListItem的XML实现
- // 动态数组与ListItem对应的子项
- new String[] { "ItemTitle", "ItemText" },
- // ListItem的XML文件里面的两个TextView ID
- new int[] { R.id.ItemTitle, R.id.ItemText });
- // 添加并且显示
- list.setAdapter(mSchedule);
- }
- }
方法二:可能跟方法一类似,还没仔细看 仅作备份
最近项目中用到了弹性滑动,但是这个弹性滑动只有在2.3之后才有了功能函数,在2.2以及之前的版本中,只有自己去实现了。
查了一下网上的资源,貌似没有提供出来一个具体的方式来实现。看到一个牛人写的一个软件中实现了弹性滑动,查了查源码,然后看了看ListView的源码,然后自己搞了一下,实现了弹性滑动。
基本思路就是得到出当前的可显示的item的位置,然后判断出否是越界,这里的越界就是是否有过度的滑动。如果有的话,就利用ScrollTo()这个方法,先把控件滑动到手势触摸事件的位置,当触摸事件结束时,滑动到屏幕顶端,或者末端。
首先是自定义一个类,继承ListView,然后在其中加入手势的事件模型。在处理touch事件时将事件交给手势listener来处理。并且返回父类的处理结果。
实现过度滑动,item跟随手势的代码是这一段:
scrollTo(0, distance/2);使得item只是过度滑动你所滑动距离的一半,这样更美观。
而实现弹性滑动的基本思路就是滑动回去加个时间。
代码如下:
这个代码是从项目中摘出的。只有上面的弹性滑动,下边部分其实一样。
显示效果如下
看别人的代码往往会给自己带来一些思路,然后自己去研究,以上的思路可以应用与Gridview,我这里实现Gridview的弹性滑动是没有问题的。我目前遇到的一个问题就是ScrollView的弹性滑动问题。看了很长时间的ScrollView的源码,但是没有太好的思路,主要是在显示部分的坐标拿不到,不像ListView里可以通过getFirstVisiblePosition()这样一个方法来拿到item的位置,继而拿到item,ScrollView中只有一个子控件。他的滑动实现貌似跟ListView,Gridview这些采用Adapter的不一样。在研究中,哪位兄台如果知道其中原来,还请告知一声。
查了一下网上的资源,貌似没有提供出来一个具体的方式来实现。看到一个牛人写的一个软件中实现了弹性滑动,查了查源码,然后看了看ListView的源码,然后自己搞了一下,实现了弹性滑动。
基本思路就是得到出当前的可显示的item的位置,然后判断出否是越界,这里的越界就是是否有过度的滑动。如果有的话,就利用ScrollTo()这个方法,先把控件滑动到手势触摸事件的位置,当触摸事件结束时,滑动到屏幕顶端,或者末端。
首先是自定义一个类,继承ListView,然后在其中加入手势的事件模型。在处理touch事件时将事件交给手势listener来处理。并且返回父类的处理结果。
- public class BouncyListView extends ListView {
- private Context context;
- /*
- * Slide over so that cross-border
- */
- private boolean outBound = false;
- private int distance;
- private int firstOut;
- public BouncyListView(Context context) {
- super(context);
- this.context = context;
- }
- public BouncyListView(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.context = context;
- }
- public BouncyListView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- this.context = context;
- }
- GestureDetector mGestureDetector = new GestureDetector(context,
- new GestureDetector.OnGestureListener() {
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- return false;
- }
- @Override
- public void onShowPress(MotionEvent e) {
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY) {
- int firstPos = getFirstVisiblePosition();
- int lastPos = getLastVisiblePosition();
- int itemCount = getCount();
- //outbound Top
- if (outBound && firstPos != 0 && lastPos != (itemCount - 1)) {
- scrollTo(0, 0);
- return false;
- }
- View firstView = getChildAt(firstPos);
- if (!outBound)
- firstOut = (int) e2.getRawY();
- if (firstView != null
- && (outBound || (firstPos == 0
- && firstView.getTop() == 0 && distanceY < 0))) {
- //Record the length of each slide
- distance = firstOut - (int) e2.getRawY();
- scrollTo(0, distance/2);
- return true;
- }
- //outbound Bottom
- return false;
- }
- @Override
- public void onLongPress(MotionEvent e) {
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2,
- float velocityX, float velocityY) {
- return false;
- }
- @Override
- public boolean onDown(MotionEvent e) {
- return false;
- }
- });
- @Override
- public boolean dispatchTouchEvent(MotionEvent event) {
- int act = event.getAction();
- if ((act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_CANCEL)
- && outBound) {
- outBound = false;
- //scroll back
- }
- if (!mGestureDetector.onTouchEvent(event)) {
- outBound = false;
- } else {
- outBound = true;
- }
- return super.dispatchTouchEvent(event);
- }
- }
实现过度滑动,item跟随手势的代码是这一段:
- int firstPos = getFirstVisiblePosition();
- int lastPos = getLastVisiblePosition();
- int itemCount = getCount();
- if (outBound && firstPos != 0
- && lastPos != (itemCount - 1)) {
- scrollTo(0, 0);
- return false;
- }
- View firstView = getChildAt(firstPos);
- if (!outBound)
- firstOut = (int) e2.getRawY();
- if (firstView != null && (outBound ||
- (firstPos == 0 && firstView.getTop() == 0 && distanceY < 0))){
- distance = firstOut - (int) e2.getRawY();
- scrollTo(0, distance/2);
- return true;
- }
scrollTo(0, distance/2);使得item只是过度滑动你所滑动距离的一半,这样更美观。
而实现弹性滑动的基本思路就是滑动回去加个时间。
代码如下:
- Rect rect = new Rect();
- getLocalVisibleRect(rect);
- TranslateAnimation am = new TranslateAnimation( 0, 0, -rect.top, 0);
- am.setDuration(300);
- startAnimation(am);
- scrollTo(0, 0);
这个代码是从项目中摘出的。只有上面的弹性滑动,下边部分其实一样。
显示效果如下
看别人的代码往往会给自己带来一些思路,然后自己去研究,以上的思路可以应用与Gridview,我这里实现Gridview的弹性滑动是没有问题的。我目前遇到的一个问题就是ScrollView的弹性滑动问题。看了很长时间的ScrollView的源码,但是没有太好的思路,主要是在显示部分的坐标拿不到,不像ListView里可以通过getFirstVisiblePosition()这样一个方法来拿到item的位置,继而拿到item,ScrollView中只有一个子控件。他的滑动实现貌似跟ListView,Gridview这些采用Adapter的不一样。在研究中,哪位兄台如果知道其中原来,还请告知一声。
- android list弹性滑动 2.3以下的实现 的两个方法 (备份)
- android listview 的弹性滑动
- View弹性滑动的几种实现方法
- android listview 的弹性滑动 简单demo 实现
- android listview 的弹性滑动 简单demo 实现
- 弹性滑动的实现与工作原理
- 使用Scroller实现View的弹性滑动
- Android View 的弹性滑动: Scroller使用说明
- View的弹性滑动
- Android Scroll实现弹性滑动 一 列表下拉弹性滑动
- Android Scroll实现弹性滑动 二 随手弹性滑动
- Android面试整理之UI部分——实现View的弹性滑动的三种方式(一)
- Android面试整理之UI部分——实现View的弹性滑动的三种方式(二)
- Android开发——弹性滑动的两种实现方式
- Android中Scroller实现弹性滑动的原理和实例应用
- android使用延时策略实现弹性滑动
- android 仿新浪微博的弹性滑动
- Android学习笔记 3.3View的弹性滑动
- Android开源项目
- 高德集团面向行业的导航二次开发平台介绍
- VC/MFC 里使窗口显示默认最大化
- 随笔
- 截取程序的网络封包
- android list弹性滑动 2.3以下的实现 的两个方法 (备份)
- postgre数据库 在conf文件中 添加ip 使其他用户可以访问我的数据库(局域网)
- Visual Assist X最新版附完美破解支持VS2010
- Eclipse快捷键大全
- 不能控制小方块移动,怎么回事?
- SharePoint Designer 2010 权限
- 经典非重复选择基础公式的推导(这里是一个循环)
- 如何控制MSSQL触发器递归
- 发现《C++ primer》第四版中文版一处翻译错误