我一直在尝试实现水平滚动视图,用户从图像列表中进行选择,并将其显示在屏幕中央。
最初,我的问题是滚动非常不稳定。我正在使用ontouch事件来实现这些。基本上,我需要使用ontouch事件,因为我需要手动滚动。由于我在水平滚动视图中有一个线性布局,我发现我不得不阻止孩子(水平滚动视图内的线性布局)感知触摸事件。
为了解决这个问题,我遵循了许多帖子建议您阻止儿童访问ontouch事件的内容。因此,我定义了一个新类,它扩展了Horizontal 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>
这是扩展Horizontal 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;
}
}