- 浏览: 5776960 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
原帖:
http://dev.10086.cn/cmdn/bbs/thread-40685-1-1.html
或者另一种实现方式(推荐)
通过上面的方法,也可以实现有弹性的ListView:
左右滑动加弹性的HorizontalScrollView
也可以这样实现有弹性的HorizontalScrollView: (推荐)
另付:
自定义ScrollView,以解决viewflipper 与scrollview的手势冲突
如何解决ViewPager在ScrollView中滑动经常失效、无法正常滑动问题?(推荐)
解决方法只需要在接近水平滚动时ScrollView不处理事件而交由其子View(即这里的ViewPager)处理即可,重写ScrollView的onInterceptTouchEvent函数,如下:
再将xml中的ScrollView改为<xxx.xxx.xxx.VerticalScrollView>即包名.重写的ScrollView的类名)即可。
本方法同样适用于ScrollView中ListView等其他View无法滚动。
https://github.com/johannilsson/android-pulltorefresh
http://dev.10086.cn/cmdn/bbs/thread-40685-1-1.html
import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.TranslateAnimation; import android.widget.ScrollView; /** * ElasticScrollView有弹性的ScrollView */ public class ElasticScrollView extends ScrollView { private View inner; private float y; private Rect normal = new Rect();; public ElasticScrollView(Context context) { super(context); } public ElasticScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { if (getChildCount() > 0) { inner = getChildAt(0); } } @Override public boolean onTouchEvent(MotionEvent ev) { if (inner == null) { return super.onTouchEvent(ev); } else { commOnTouchEvent(ev); } return super.onTouchEvent(ev); } public void commOnTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: y = ev.getY(); break; case MotionEvent.ACTION_UP: if (isNeedAnimation()) { animation(); } break; case MotionEvent.ACTION_MOVE: final float preY = y; float nowY = ev.getY(); int deltaY = (int) (preY - nowY); // 滚动 scrollBy(0, deltaY); y = nowY; // 当滚动到最上或者最下时就不会再滚动,这时移动布局 if (isNeedMove()) { if (normal.isEmpty()) { // 保存正常的布局位置 normal.set(inner.getLeft(), inner.getTop(), inner .getRight(), inner.getBottom()); } // 移动布局 inner.layout(inner.getLeft(), inner.getTop() - deltaY, inner .getRight(), inner.getBottom() - deltaY); } break; default: break; } } // 开启动画移动 public void animation() { // 开启移动动画 TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(), normal.top); ta.setDuration(200); inner.startAnimation(ta); // 设置回到正常的布局位置 inner.layout(normal.left, normal.top, normal.right, normal.bottom); normal.setEmpty(); } // 是否需要开启动画 public boolean isNeedAnimation() { return !normal.isEmpty(); } // 是否需要移动布局 public boolean isNeedMove() { int offset = inner.getMeasuredHeight() - getHeight(); int scrollY = getScrollY(); if (scrollY == 0 || scrollY == offset) { return true; } return false; } }
<?xml version="1.0" encoding="utf-8"?> <com.rebound.myscroll.ElasticScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:id="@+id/sv" android:layout_height="fill_parent" > <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="......一个很长很长的字符串......" /> </com.rebound.myscroll.ElasticScrollView>
或者另一种实现方式(推荐)
import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.widget.ScrollView; public class MtScrollView extends ScrollView { private static final int MAX_Y_OVERSCROLL_DISTANCE = 200; private Context mContext; private int mMaxYOverscrollDistance; public MtScrollView(Context context){ super(context); mContext = context; initBounceListView(); } public MtScrollView(Context context, AttributeSet attrs){ super(context, attrs); mContext = context; initBounceListView(); } public MtScrollView(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); mContext = context; initBounceListView(); } private void initBounceListView(){ final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); final float density = metrics.density; mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent){ //这块是关键性代码 return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent); } }
通过上面的方法,也可以实现有弹性的ListView:
public class BounceListView extends ListView { private static final int MAX_Y_OVERSCROLL_DISTANCE = 200; private Context mContext; private int mMaxYOverscrollDistance; public BounceListView(Context context) { super(context); mContext = context; initBounceListView(); } public BounceListView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; initBounceListView(); } public BounceListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; initBounceListView(); } private void initBounceListView() { //get the density of the screen and do some maths with it on the max overscroll distance //variable so that you get similar behaviors no matter what the screen size final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); final float density = metrics.density; mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { //This is where the magic happens, we have replaced the incoming maxOverScrollY with our own custom variable mMaxYOverscrollDistance; return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent); } }
左右滑动加弹性的HorizontalScrollView
import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.TranslateAnimation; import android.widget.HorizontalScrollView; public class ElasticHorizontalScrollView extends HorizontalScrollView { private View inner; private Rect normal = new Rect(); private float x; public ElasticHorizontalScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public ElasticHorizontalScrollView(Context context) { super(context); } @Override protected void onFinishInflate() { if (getChildCount() > 0) { inner = getChildAt(0); } super.onFinishInflate(); } @Override public boolean onTouchEvent(MotionEvent ev) { if (ev == null) { return super.onTouchEvent(ev); } else { commOnTouchEvent(ev); } return super.onTouchEvent(ev); } private void commOnTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: x = ev.getX(); break; case MotionEvent.ACTION_UP: if (isNeedAnimation()) { animation(); } break; case MotionEvent.ACTION_MOVE: final float preX = x; float nowX = ev.getX(); int distanceX = (int) (preX - nowX); scrollBy(distanceX, 0); x = nowX; if (isNeedMove()) { if (normal.isEmpty()) { normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom()); } inner.layout(inner.getLeft() - distanceX, inner.getTop(), inner.getRight() - distanceX, inner.getBottom()); } break; default: break; } } private void animation() { TranslateAnimation mTranslateAnimation = new TranslateAnimation(inner.getLeft(), 0, normal.left, 0); mTranslateAnimation.setDuration(50); inner.setAnimation(mTranslateAnimation); inner.layout(normal.left, normal.top, normal.right, normal.bottom); normal.setEmpty(); } private boolean isNeedAnimation() { return !normal.isEmpty(); } private boolean isNeedMove() { int offset = inner.getMeasuredWidth() - getWidth(); int scrollX = getScrollX(); if (scrollX == 0 || offset == scrollX) return true; return false; } }
<com.example.horiztalscrollviewtext.ElasticHorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#D1EEEE" android:scrollbars="none" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#F5F5F5" android:orientation="horizontal" > <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/main_guide_0" /> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/main_guide_0" /> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/main_guide_0" /> </LinearLayout> </com.example.horiztalscrollviewtext.ElasticHorizontalScrollView>
也可以这样实现有弹性的HorizontalScrollView: (推荐)
import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.widget.HorizontalScrollView; public class BouncyHScrollView extends HorizontalScrollView { private static final int MAX_X_OVERSCROLL_DISTANCE = 200; private Context mContext; private int mMaxXOverscrollDistance; public BouncyHScrollView(Context context) { super(context); // TODO Auto-generated constructor stub mContext = context; initBounceDistance(); } public BouncyHScrollView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub mContext = context; initBounceDistance(); } public BouncyHScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub mContext = context; initBounceDistance(); } private void initBounceDistance(){ final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); mMaxXOverscrollDistance = (int) (metrics.density * MAX_X_OVERSCROLL_DISTANCE); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent){ //这块是关键性代码 return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, mMaxXOverscrollDistance, maxOverScrollY, isTouchEvent); } }
另付:
自定义ScrollView,以解决viewflipper 与scrollview的手势冲突
import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.ScrollView; /** * 自定义ScrollView,并重写其onTouchEvent和dispatchTouchEvent方法, * 以解决viewflipper 与scrollview的手势冲突 * @author yangjiantong * */ public class MyScrollView extends ScrollView { GestureDetector gestureDetector; public MyScrollView(Context context) { super(context); // TODO Auto-generated constructor stub } public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public MyScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public void setGestureDetector(GestureDetector gestureDetector) { this.gestureDetector = gestureDetector; } @Override public boolean onTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub super.onTouchEvent(ev); return gestureDetector.onTouchEvent(ev); } @Override public boolean dispatchTouchEvent(MotionEvent ev){ gestureDetector.onTouchEvent(ev); super.dispatchTouchEvent(ev); return true; } }
如何解决ViewPager在ScrollView中滑动经常失效、无法正常滑动问题?(推荐)
解决方法只需要在接近水平滚动时ScrollView不处理事件而交由其子View(即这里的ViewPager)处理即可,重写ScrollView的onInterceptTouchEvent函数,如下:
package cc.newnews.view; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.widget.ScrollView; public class VerticalScrollView extends ScrollView { private GestureDetector mGestureDetector; public VerticalScrollView(Context context, AttributeSet attrs) { super(context, attrs); mGestureDetector = new GestureDetector(context, new YScrollDetector()); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev); } class YScrollDetector extends SimpleOnGestureListener { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { /** * 如果我们滚动更接近水平方向,返回false,让子视图来处理它 */ return (Math.abs(distanceY) > Math.abs(distanceX)); } } }
再将xml中的ScrollView改为<xxx.xxx.xxx.VerticalScrollView>即包名.重写的ScrollView的类名)即可。
本方法同样适用于ScrollView中ListView等其他View无法滚动。
https://github.com/johannilsson/android-pulltorefresh
- Rebound.rar (41.5 KB)
- 下载次数: 640
发表评论
-
NestedScrollView滚动到顶部固定子View悬停挂靠粘在顶端
2018-10-31 20:45 6804网上有一个StickyScrollView,称之为粘性Scro ... -
自定义Behavior实现AppBarLayout越界弹性效果
2017-03-31 09:33 10227一、继承AppBarLayout.Beha ... -
Android - 一种相似图片搜索算法的实现
2017-03-31 09:33 2568算法 缩小尺寸。 将图片缩小到8x8的尺寸,总共64个 ... -
使用SpringAnimation实现带下拉弹簧动画的 ScrollView
2017-03-30 11:30 2790在刚推出的 Support Library 25.3.0 里面 ... -
Android为应用添加角标(Badge)
2017-03-30 11:21 61011.需求简介 角标是什么意思呢? 看下图即可明了: 可 ... -
Android端与笔记本利用局域网进行FTP通信
2017-03-23 10:17 923先看图 打开前: 打开后: Activity类 ... -
PorterDuffColorFilter 在项目中的基本使用
2017-03-03 10:58 1299有时候标题栏会浮在内容之上,而内容会有颜色的变化,这时候就要求 ... -
ColorAnimationView 实现了滑动Viewpager 时背景色动态变化的过渡效果
2017-02-24 09:41 2170用法在注释中: import android.anima ... -
迷你轻量级全方向完美滑动处理侧滑控件SlideLayout
2017-01-16 16:53 2548纯手工超级迷你轻量级全方向完美滑动处理侧滑控件(比官方 sup ... -
Effect
2017-01-05 09:57 0https://github.com/JetradarMobi ... -
动态主题库Colorful,容易地改变App的配色方案
2016-12-27 14:49 2517Colorful是一个动态主题库,允许您很容易地改变App的配 ... -
对视图的对角线切割DiagonalView
2016-12-27 14:23 1071提供对视图的对角线切割,具有很好的用户定制 基本用法 ... -
仿淘宝京东拖拽商品详情页上下滚动黏滞效果
2016-12-26 16:53 3418比较常用的效果,有现成的,如此甚好!:) import ... -
让任意view具有滑动效果的SlideUp
2016-12-26 09:26 1659基本的类,只有一个: import android.a ... -
AdvancedWebView
2016-12-21 09:44 16https://github.com/delight-im/A ... -
可设置圆角背景边框的按钮, 通过调节色彩明度自动计算按下(pressed)状态颜色
2016-11-02 22:13 1860可设置圆角背景边框的的按钮, 通过调节色彩明度自动计算按下(p ... -
网络请求库相关
2016-10-09 09:35 62https://github.com/amitshekhari ... -
ASimpleCache一个简单的缓存框架
2015-10-26 22:53 2121ASimpleCache 是一个为android制定的 轻量级 ... -
使用ViewDragHelper实现的DragLayout开门效果
2015-10-23 10:55 3334先看一下图,有个直观的了解,向下拖动handle就“开门了”: ... -
保证图片长宽比的同时拉伸图片ImageView
2015-10-16 15:40 3678按比例放大图片,不拉伸失真 import android. ...
相关推荐
android HorizontalScrollView +listview blog 地址: http://blog.csdn.net/aaawqqq/article/details/25082417
StockMarket主流股票行情显示,ScrollView+HorizontalScrollView+listview 联动(截图弄的不是很好)
通过在HorizontalScrollView中嵌套ListView控件,实现ListView的水平滑动效果
点击listView中的图片,在HorizontalScrollView显示出来,在点击item,图片消失
HorizontalScrollView不可以和ListView同时用,因为ListView有自己的滚动条设置。最重要的是,如果在需要显示很大的list的情况下,两者同时用则会使ListView在一些重要的优化上失效。出现这种失效的原因在于,...
该资源实现了HorizontalScrollView嵌套GridView实现单行滚动效果。选中GridView的item,该item下面的ListView跟着变化,并处理了他们之间的焦点转换问题
Android 用HorizontalScrollView实现ListView的Item滑动删除
甚至还试过在左侧放置ListView,右侧放置HorizontalScrollView,然后在右侧的ScrollView里面在放置一个ListView,然后通过事件分发,是左右两侧的ListView上下滚动的时候保持同步,但是总是会出现左右不同步的现象,这样是...
Android 自定义 HorizontalScrollView,水平滑动的Listview,一屏可以显示多个张图片,解决ScrollView上下滚动事件冲突问题。
列表上拉下拉刷新支持 ListView ExpandableListView GridView WebView ScrollView HorizontalScrollView ViewPager
listivew模拟horizontalscrollview 效果的代码
其中包括了webview,scrollview,listview,horizontalscrollview,gridview,expandablelistview,控件的下拉刷新,和部分控件的上拉更多,demo讲解的是listview上拉更多和下拉刷新的详细使用方法和参数的设置!...
Android-PullToRefresh-master 支持以下实现上拉加载 下拉刷新: ListView ExpandableListView GridView WebView ScrollView HorizontalScrollView ViewPager
provided View, ScrollView, HorizontalScrollView, ListView, RecyclerView, WebView screenshots. RecyclerView currently only support LinearLayoutManager.VERTICAL support android sdk version 19 ...
ViewCapture - 实现单独对某个Android视图进行截屏。支持ScrollView, HorizontalScrollView, ListView, RecyclerView, WebView。
Android平台框架中为我们提供了诸如ListView、GirdView、ScrollView等滚动视图控件,这几个视图控件也是我们平常使用最多的。下面介绍一下HorizontalScrollView的使用和需要注意的点: HorizontalScrollView是一个...
PullToRefresh是一套实现非常好的下拉刷新库,它支持: ListView ExpandableListView GridView WebView ScrollView HorizontalScrollView ViewPager 等多种常用的需要刷新的View类型,而且使用起来也十分方便。
ListView ExpandableListView GridView WebView ScrollView HorizontalScrollView ViewPager Integrated End of List Listener for use of detecting when the user has scrolled to the bottom. Maven Support. ...
用于多种控件的下拉刷新上拉加载,其中包括WebView,ListView,GridView,ScrollView,HorizontalScrollView,ExpandableListView