扩展水平ScrollView以阻止子项上的ontouch事件不起作用

时间:2012-11-15 15:11:53

标签: ontouchevent ontouchlistener horizontalscrollview

我一直在尝试实现水平滚动视图,用户从图像列表中进行选择,并将其显示在屏幕中央。

最初,我的问题是滚动非常不稳定。我正在使用ontouch事件来实现这些。基本上,我需要使用ontouch事件,因为我需要手动滚动。由于我在水平滚动视图中有一个线性布局,我发现我不得不阻止孩子(水平滚动视图内的线性布局)感知触摸事件。

为了解决这个问题,我遵循了许多帖子建议您阻止儿童访问ontouch事件的内容。因此,我定义了一个新类,它扩展了Horizo​​ntal ScrollView并实现了ontouch事件和onInterceptTouchEvent。

我的问题是这种方法无效,我继续收到以下消息,因为我做了这些更改:

  

java.lang.RuntimeException:无法启动活动ComponentInf0 {com.demo.touch / com.demo.touch.EltouchActivity}:java.lang.ClassCastException:com.demo.touch.EltouchActivity无法强制转换为android.view .View $ OnTouchListener

我无法弄清楚我的问题是什么。谁能帮我这个?任何帮助将不胜感激,

理查德

以下是EltouchActivity的代码(我的主要活动):

package com.demos.touch;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AbsListView.OnScrollListener;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

 public class EltouchActivity extends Activity implements OnClickListener{

ImageView main, cow, horse, rooster, geese, dog, duck, goat;
float[] x = new float[10];
float[] y = new float[10];

   @Override
   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.eltouch);


    main = (ImageView) findViewById(R.id.ivMain);
    cow = (ImageView) findViewById(R.id.ivCow);
    horse = (ImageView) findViewById(R.id.ivHorse);
    rooster = (ImageView) findViewById(R.id.ivRooster);
    geese = (ImageView) findViewById(R.id.ivGeese);
    dog = (ImageView) findViewById(R.id.ivDog);
    goat = (ImageView) findViewById(R.id.ivGoat);

    cow.setOnClickListener(this);
    horse.setOnClickListener(this);
    rooster.setOnClickListener(this);
    geese.setOnClickListener(this);
    dog.setOnClickListener(this);
    goat.setOnClickListener(this);

    MyHorScrollView hsv = (MyHorScrollView) findViewById(R.id.myhorscrlvw);
    hsv.setOnTouchListener((OnTouchListener) this);
  }


public void onClick(View arg0) {
    switch(arg0.getId()){
    case R.id.ivCow:
        main.setImageResource(R.drawable.cow);
        break;
    case R.id.ivDog:
        main.setImageResource(R.drawable.dog);
        break;  
    case R.id.ivDuck:
        main.setImageResource(R.drawable.duck);
        break;
    case R.id.ivDucklings:
        main.setImageResource(R.drawable.ducklings);
        break;
    case R.id.ivGeese:
        main.setImageResource(R.drawable.geeze);
        break;
    case R.id.ivGoat:
        main.setImageResource(R.drawable.goat);
        break;
    }

}

}

这是我的xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/otherlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" 
android:background="@drawable/shark_background_colored">

    <ImageView 
    android:layout_width="400dp"
    android:layout_height="280dp"
    android:src="@drawable/geeze"
    android:layout_gravity="center_horizontal"
    android:background="#e9ccdd"
    android:id="@+id/ivMain" />
<com.demos.touch.MyHorScrollView
    android:id="@+id/myhorscrlvw"
    android:layout_width="950dp"
    android:layout_height="304dp"
    android:layout_gravity="center_horizontal"
    android:scrollbars="none" 
    android:background="#ebee7c">

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:id="@+id/horizontallayout"
    android:background="#e9a4dd"
    android:layout_gravity="center_vertical">

    <ImageView 
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@drawable/cow"
    android:layout_gravity="center_horizontal"
    android:id="@+id/ivCow" />
    <ImageView 
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@drawable/horse"
    android:layout_gravity="center_horizontal"
    android:id="@+id/ivHorse" 
    android:paddingLeft="25dp"/>
    <ImageView 
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@drawable/rooster"
    android:layout_gravity="center_horizontal"
    android:id="@+id/ivRooster" 
    android:paddingLeft="25dp"/>
   <ImageView 
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@drawable/geeze"
    android:layout_gravity="center_horizontal"
    android:id="@+id/ivGeese" 
    android:paddingLeft="25dp"/>
    <ImageView 
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@drawable/dog"
    android:layout_gravity="center_horizontal"
    android:id="@+id/ivDog" 
    android:paddingLeft="25dp"/>
    <ImageView 
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@drawable/duck"
    android:layout_gravity="center_horizontal"
    android:id="@+id/ivDuck" 
    android:paddingLeft="25dp"/>
    <ImageView 
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@drawable/goat"
    android:layout_gravity="center_horizontal"
    android:id="@+id/ivGoat" 
    android:paddingLeft="25dp"/>
</LinearLayout>
</com.arturo.ejemplodetouch.MyHorScrollView>
</LinearLayout>

这是扩展Horizo​​ntal ScrollView的类:

package com.demos.touch;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.TextView;

public class MyHorScrollView extends HorizontalScrollView{

   public MyHorScrollView(Context context) {
      super(context);
   }

   public MyHorScrollView(Context context, AttributeSet attrs, int defStyle) {
       super(context, attrs, defStyle);
   }

   public MyHorScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
   }

   public boolean onInterceptTouchEvent(MotionEvent ev) {
         return true;
   }

   public boolean onTouch(View arg0, MotionEvent arg1) {

      int action = arg1.getAction() & MotionEvent.ACTION_MASK;
      float currentX = 0;
      int pointerIndex = (arg1.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >>
      MotionEvent.ACTION_POINTER_INDEX_SHIFT;
      int pointerId = arg1.getPointerId(pointerIndex);

      float downX=0, totalX;
      int scrollByX = 0;
      float[] x = new float[10];
      float[] y = new float[10];

      switch(action){
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:
           downX=(int)arg1.getRawX();
           currentX=0;
           scrollByX = 0;
           break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL:
           currentX=(int)arg1.getRawX();
           scrollByX = (int)(downX - currentX);
           arg0.scrollBy(scrollByX, 0);//end scrolling
           break;   
        case MotionEvent.ACTION_MOVE:
           currentX=(int)arg1.getRawX();
           scrollByX = (int)(downX - currentX);//begin scrolling
           arg0.scrollBy(scrollByX, 0);
           downX = currentX;
           break;
       }
       return true;
    }
}

0 个答案:

没有答案