2019独角兽企业重金招聘Python工程师标准>>>

最近在做一个简单的展示界面时,遇到了一个比较棘手的问题。由于要展示多项内容,所以使用ViewFlipper作为水平滑动容器;而每项内容中由于许多文本较长,因此需要使用ScrollView作为垂直滑动容器。基本的界面布局大致如下:

外部文件common_list_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/geyan_query_view_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/mid_bg">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="43dip"
android:orientation="vertical"
android:gravity="top"
android:layout_gravity="top">
<Gallery
android:id="@+id/gallery_data"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="top"
android:layout_gravity="top"
android:spacing="60dip"
android:paddingLeft="6dip"
android:paddingRight="6dip"
>
</Gallery>
</LinearLayout>
<ImageView
android:id="@+id/main_background"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<include layout="@layout/common_title_view"
android:id="@+id/title"/>
</RelativeLayout>

内部文件common_info_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/linear">
<TextView
android:id="@+id/text_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dip"
android:layout_marginTop="5dip"
android:gravity="center"
android:textSize="20sp"
android:textStyle="bold"
android:textColor="#181712"
/>
<ScrollView
android:id="@+id/scroll"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="5dip"
android:fadeScrollbars="true"
>
<TextView
android:id="@+id/text_detail"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.3"
android:textSize="18sp"
android:textColor="#181712"
android:singleLine="false"
/>
</ScrollView>
</LinearLayout>

由于ViewFlipper在外,ScrollView在内,因此一般的做法是定义一个手势响应类来处理响应事件,并将响应事件的处理交给内层的ScrollView。大致代码如下:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;public class Test1 extends Activity {private ViewFlipper viewFlipper;private String[] descriptionsArray;private String[] titleArray;private int selectedPosition;private TextView textViewTitle;private TextView textViewContent;private FriendlyScrollView scroll;private LayoutInflater mInflater;private GestureDetector gestureDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubrequestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.common_info_list_view);InitUI();super.onCreate(savedInstanceState);Toast.makeText(this, R.string.hello, Toast.LENGTH_SHORT).show();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// TODO Auto-generated method stubsuper.onCreateOptionsMenu(menu);return false;}@Overridepublic void onBackPressed() {// TODO Auto-generated method stubfinish();}private void InitUI(){viewFlipper = (ViewFlipper) findViewById(R.id.viewflipper_data);mInflater = LayoutInflater.from(this);fillDate();viewFlipper.addView(getContentView());}private void fillDate(){selectedPosition = 0;titleArray = getResources().getStringArray(R.array.title_array);descriptionsArray = getResources().getStringArray(R.array.description_array);gestureDetector = new GestureDetector(new CommonGestureListener());}private View getContentView() {View contentView = new View(this);contentView = mInflater.inflate(R.layout.common_info_item_view, null);textViewTitle = (TextView) contentView.findViewById(R.id.text_title);textViewContent = (TextView) contentView.findViewById(R.id.text_detail);textViewTitle.setText(titleArray[selectedPosition]);textViewTitle.setPadding(10, 0, 10, 0);textViewContent.setText(descriptionsArray[selectedPosition]);textViewContent.setPadding(10, 5, 10, 5);scroll = (FriendlyScrollView) contentView.findViewById(R.id.scroll);scroll.setOnTouchListener(onTouchListener);scroll.setGestureDetector(gestureDetector);return contentView;}private View.OnTouchListener onTouchListener = new View.OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubreturn gestureDetector.onTouchEvent(event);}};public class CommonGestureListener extends SimpleOnGestureListener {@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubLog.d("QueryViewFlipper", "====> Jieqi: do onDown...");return false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stubLog.d("QueryViewFlipper", "====> Jieqi: do onShowPress...");super.onShowPress(e);}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stubLog.d("QueryViewFlipper", "----> Jieqi: do onLongPress...");}@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {// TODO Auto-generated method stubLog.d("QueryViewFlipper", "====> Jieqi: do onSingleTapConfirmed...");return false;}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubLog.d("QueryViewFlipper", "====> Jieqi: do onSingleTapUp...");return false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY){// TODO Auto-generated method stubLog.d("QueryViewFlipper", "====> Jieqi: do onFling...");if (e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 50) {//向左selectedPosition = selectedPosition + 1 < titleArray.length ? (selectedPosition + 1) : 0;viewFlipper.addView(getContentView());viewFlipper.setInAnimation(AnimationControl.inFromRightAnimation());viewFlipper.setOutAnimation(AnimationControl.outToLeftAnimation());viewFlipper.showNext();viewFlipper.removeViewAt(0);} else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 50) {//向右selectedPosition = selectedPosition > 0 ? (selectedPosition - 1) : (titleArray.length - 1);viewFlipper.addView(getContentView());viewFlipper.setInAnimation(AnimationControl.inFromLeftAnimation());viewFlipper.setOutAnimation(AnimationControl.outToRightAnimation());viewFlipper.showNext();viewFlipper.removeViewAt(0);}return true;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {// TODO Auto-generated method stubLog.d("QueryViewFlipper", "====> Jieqi: do onScroll...");return super.onScroll(e1, e2, distanceX, distanceY);}}
}

这个时候问题出现了,通过Log显示,当ScrollView中内容太短的时候,ScrollView不会触发OnScroll和OnFling事件,导致ViewFlipper左右滑动不响应。(当然后来的另一个测试表明这个问题在ListView上不存在)
为了解决这一个问题,我重新自定义了一个FriendlyScrollView类,来重写ScrollView的onTouchEvent和dispatchTouchEvent方法,具体如下:

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ScrollView;public class FriendlyScrollView extends ScrollView {GestureDetector gestureDetector;public FriendlyScrollView(Context context) {super(context);// TODO Auto-generated constructor stub}public FriendlyScrollView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public FriendlyScrollView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public void setGestureDetector(GestureDetector gestureDetector) {this.gestureDetector = gestureDetector;}@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);return gestureDetector.onTouchEvent(event);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev){gestureDetector.onTouchEvent(ev);super.dispatchTouchEvent(ev);return true;} }

然后将common_info_view.xml和程序中的ScrollView改成FriendlyScrollView,终于解决了这个问题。

转载于:https://my.oschina.net/u/268088/blog/678802

Android-解决ViewFlipper与ScrollView滑动响应事件拦截的问题【转】相关推荐

  1. 【Android 手势冲突】Colin带你彻底解决RecyclerView与ScrollView滑动冲突问题,并实现RecyclerView悬停导航栏(附demo哦)

    在新一期的需求中,产品要求我们做出和美团某个页面类似的功能,即一个页面包含在scrollView中,上面一个部分放置一些常用的广告banner.宫格tab等,下面放置一个RecyclerView用于展 ...

  2. Android开发之解决ListView和ScrollView滑动冲突的方法

    我们看下图: 不管怎么滑动都无法显示listview的剩余数据,只能显示一条,我们看下布局,ScrollView里面嵌套ListView <?xml version="1.0" ...

  3. Android透明到白色滑动渐变,Android中Toolbar随着ScrollView滑动透明度渐变效果实现...

    Android中Toolbar随着ScrollView滑动透明度渐变效果实现 一.思路:监听ScrollView的滑动事件 不断的修改Toolbar的透明度 二.注意 1.ScrollView 6.0 ...

  4. Android使用ViewFlipper实现左右滑动效果面

    在我的博客中,上次是使用ViewPager实现左右滑动的效果的,请看文章:Android使用ViewPager实现左右滑动效果 . 这次我来使用ViewFlipper实现这种效果,好了,先看看效果吧: ...

  5. Android中监听ScrollView滑动停止和滑动到底部

    1.监听ScrollView滑动停止: [java] view plaincopy /********************监听ScrollView滑动停止********************* ...

  6. unity 鼠标滑动响应事件

    void OnGUI(){if (Event.current.type == EventType.MouseDown){//判断当前手指是按下事件touchFirst = Event.current. ...

  7. android解决ScrollView嵌套ListView不能下拉刷新

    为了不误导新人,这篇帖子写的比较早了,这里2016年2月23日21:33:20更新的内容: 千万不要在实际开发中用scrollview嵌套listview\recylerview来处理滑动嵌套,   ...

  8. Android自定义View,滑动,事件传递小结

    本文只总结知识点 欢迎补充,欢迎纠正.谢谢! #预备知识 Android控件框架 ####1. View树状图 Android的View树结构总是以一个ViewGroup开始,包含多个View或Vie ...

  9. android 事件拦截 (Viewpager不可以左右滑动)

    以前没有做过真正的需求,所以从来没有觉得事件拦截分发处理有什么好懂的. 现在做需求了,真的是什么需求都有,你作为开发都要去研究实现.比如说,只能点不能滑动的viewpager.其实这都可以不用view ...

最新文章

  1. asp程序错误详细说明例表
  2. 7、CSS 属性选择器
  3. 【树莓派编程】检测有没有物体移动 +人脸识别
  4. nginx 响应服务器静态,405 Not Allowed,nginx静态文件响应post请求
  5. SOL注入——HTTP头部注入(2)(七)
  6. H5在线商城/全新商城支持团购优惠劵砍价
  7. 字符串匹配——枚举法
  8. delphi IOS 通知 TNotification
  9. 知识图谱属性与关系区别
  10. 记一次物理服务器Linux系统中未找到网卡的处理方式
  11. PyTorch搭建LeNet-5模型(在MNIST数据集上准确率接近100%)
  12. ViewFlipper(翻转视图)使用详解
  13. 从零开始学数据分析之——《微积分》第一章 函数与极限
  14. java date类赋值日期_Java中Date时间类
  15. 解决百度网盘下载慢,提速下载
  16. 天地图三维帮助文档(Cesium)
  17. 网络安全---数字签名
  18. n维单位向量的生成公式
  19. 2022年全球市场重疾险总体规模、主要企业、主要地区、产品和应用细分研究报告
  20. Java String,看这篇就够了

热门文章

  1. 解决虚拟机上的tomcat无法被主机访问的问题
  2. vue-cli3 中 sockjs-node/info?t=报错 的解决方法
  3. 解决IE9下JQuery的ajax失效的问题
  4. IIS7部署网站出现500.19错误(权限不足)的解决方案
  5. CondaHTTPError问题的解决
  6. Linux服务器出现:No space left on device的解决方法
  7. Windows下安装RabbitMQ报错:unable to perform an operation on node时的解决方案
  8. 解决element-ui的el-select组件文字超过宽度时不出现横向滚动条问题
  9. 为什么NaN - NaN == 0.0与英特尔C ++编译器?
  10. 如何枚举String类型的枚举?