ฉันมี ScrollView ที่ล้อมรอบเค้าโครงทั้งหมดของฉันเพื่อให้หน้าจอทั้งหมดเลื่อนได้ องค์ประกอบแรกที่ฉันมีใน ScrollView นี้คือบล็อก HorizontalScrollView ที่มีคุณสมบัติที่สามารถเลื่อนดูได้ในแนวนอน ฉันได้เพิ่มออนทัชลิสเทอร์เนอร์ใน horizontalscrollview เพื่อจัดการกิจกรรมการสัมผัสและบังคับให้มุมมอง "สแน็ป" ไปยังภาพที่ใกล้ที่สุดในเหตุการณ์ ACTION_UP
ดังนั้นเอฟเฟกต์ที่ฉันจะทำก็เหมือนกับหน้าจอหลักของ Android ที่คุณสามารถเลื่อนจากหน้าจอหนึ่งไปอีกหน้าจอหนึ่งและมันจะล็อคหน้าจอเดียวเมื่อคุณยกนิ้วขึ้น
ทั้งหมดนี้ใช้งานได้ดียกเว้นปัญหาเดียว: ฉันต้องกวาดนิ้วจากซ้ายไปขวาเกือบจะสมบูรณ์ในแนวนอนเพื่อให้ ACTION_UP ลงทะเบียนเลย ถ้าฉันปัดในแนวตั้งอย่างน้อยที่สุด (ซึ่งฉันคิดว่าหลายคนมักจะทำบนโทรศัพท์ของพวกเขาเมื่อปัดไปด้านข้าง) ฉันจะได้รับ ACTION_CANCEL แทนที่จะเป็น ACTION_UP ทฤษฎีของฉันคือว่าสิ่งนี้เป็นเพราะ horizontalscrollview อยู่ภายใน scrollview และ scrollview นั้นถูกไฮแจ็คแตะแนวตั้งเพื่อให้สามารถเลื่อนแนวตั้งได้
ฉันจะปิดการใช้งานกิจกรรมการสัมผัสสำหรับ scrollview จากภายใน scrollview แนวนอนของฉัน แต่ยังคงอนุญาตให้เลื่อนแนวตั้งปกติที่อื่นใน scrollview ได้อย่างไร
นี่คือตัวอย่างรหัสของฉัน:
public class HomeFeatureLayout extends HorizontalScrollView {
private ArrayList<ListItem> items = null;
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;
private static final int SWIPE_MIN_DISTANCE = 5;
private static final int SWIPE_THRESHOLD_VELOCITY = 300;
private int activeFeature = 0;
public HomeFeatureLayout(Context context, ArrayList<ListItem> items){
super(context);
setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
setFadingEdgeLength(0);
this.setHorizontalScrollBarEnabled(false);
this.setVerticalScrollBarEnabled(false);
LinearLayout internalWrapper = new LinearLayout(context);
internalWrapper.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
internalWrapper.setOrientation(LinearLayout.HORIZONTAL);
addView(internalWrapper);
this.items = items;
for(int i = 0; i< items.size();i++){
LinearLayout featureLayout = (LinearLayout) View.inflate(this.getContext(),R.layout.homefeature,null);
TextView header = (TextView) featureLayout.findViewById(R.id.featureheader);
ImageView image = (ImageView) featureLayout.findViewById(R.id.featureimage);
TextView title = (TextView) featureLayout.findViewById(R.id.featuretitle);
title.setTag(items.get(i).GetLinkURL());
TextView date = (TextView) featureLayout.findViewById(R.id.featuredate);
header.setText("FEATURED");
Image cachedImage = new Image(this.getContext(), items.get(i).GetImageURL());
image.setImageDrawable(cachedImage.getImage());
title.setText(items.get(i).GetTitle());
date.setText(items.get(i).GetDate());
internalWrapper.addView(featureLayout);
}
gestureDetector = new GestureDetector(new MyGestureDetector());
setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL ){
int scrollX = getScrollX();
int featureWidth = getMeasuredWidth();
activeFeature = ((scrollX + (featureWidth/2))/featureWidth);
int scrollTo = activeFeature*featureWidth;
smoothScrollTo(scrollTo, 0);
return true;
}
else{
return false;
}
}
});
}
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
//right to left
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
activeFeature = (activeFeature < (items.size() - 1))? activeFeature + 1:items.size() -1;
smoothScrollTo(activeFeature*getMeasuredWidth(), 0);
return true;
}
//left to right
else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
activeFeature = (activeFeature > 0)? activeFeature - 1:0;
smoothScrollTo(activeFeature*getMeasuredWidth(), 0);
return true;
}
} catch (Exception e) {
// nothing
}
return false;
}
}
}
HomeFeatureLayout extends HorizontalScrollView
) ที่นี่velir.com/blog/index.php/2010/11/17/… มีความคิดเห็นเพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อมีการสร้างคลาสเลื่อนที่กำหนดเอง
MeetMe's HorizontalListView
ห้องสมุด