मेरे पास एक स्क्रॉल दृश्य है जो मेरे पूरे लेआउट को घेरता है ताकि पूरी स्क्रीन स्क्रॉल करने योग्य हो। इस स्क्रॉल दृश्य में जो पहला तत्व है, वह एक क्षैतिज क्षैतिज अवरोधक खंड है जिसमें ऐसी विशेषताएँ हैं जिन्हें क्षैतिज रूप से स्क्रॉल किया जा सकता है। मैंने स्पर्श घटनाओं को संभालने और ACTION_UP घटना पर निकटतम छवि को "स्नैप" करने के लिए दृश्य को बाध्य करने के लिए क्षैतिज ऑन-लाइन सूची में एक ontouchlistener जोड़ा है।
इसलिए मैं जिस प्रभाव के लिए जा रहा हूं वह स्टॉक एंड्रॉइड होमस्क्रीन की तरह है जहां आप एक से दूसरे तक स्क्रॉल कर सकते हैं और जब आप अपनी उंगली उठाते हैं तो यह एक स्क्रीन पर आ जाती है।
यह सब एक समस्या को छोड़कर महान काम करता है: मुझे कभी भी पंजीकरण करने के लिए ACTION_UP के लिए लगभग पूरी तरह से क्षैतिज रूप से बाएं से दाएं स्वाइप करने की आवश्यकता होती है। यदि मैं बहुत कम में लंबवत स्वाइप करता हूं (जो मुझे लगता है कि कई लोग अपने फोन को साइड-साइड स्वाइप करते समय करते हैं), तो मुझे एक ACTION_UP के बजाय एक ACTION_CANCEL प्राप्त होगा। मेरा सिद्धांत यह है कि इसका कारण यह है कि क्षैतिज स्क्रोलव्यू एक स्क्रॉलव्यू के भीतर है, और स्क्रॉलव्यू ऊर्ध्वाधर स्क्रॉल के लिए अनुमति देने के लिए ऊर्ध्वाधर स्पर्श का अपहरण कर रहा है।
मैं अपने क्षैतिज स्क्रोलव्यू के भीतर से स्क्रॉलव्यू के लिए स्पर्श घटनाओं को कैसे अक्षम कर सकता हूं, लेकिन फिर भी स्क्रॉलवॉच में कहीं और सामान्य ऊर्ध्वाधर स्क्रॉलिंग की अनुमति है?
यहाँ मेरे कोड का एक नमूना है:
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
पुस्तकालय का उपयोग कर रहा हूं ।