আমার একটি স্ক্রোলভিউ রয়েছে যা আমার পুরো লেআউটটিকে ঘিরে যাতে পুরো স্ক্রিনটি স্ক্রোলযোগ্য হয়। এই স্ক্রোলভিউতে আমার প্রথম উপাদানটি হরাইজেন্টালস্ক্রোলভিউ ব্লক যা এমন বৈশিষ্ট্যগুলি রয়েছে যা অনুভূমিকভাবে স্ক্রোল করা যায়। আমি স্পর্শ ইভেন্টগুলি পরিচালনা করতে এবং অ্যাকশন_আপ ইভেন্টের নিকটতম চিত্রটিতে "স্ন্যাপ" করতে বাধ্য করার জন্য অনুভূমিক স্ক্রোলভিউতে একটি অন্টচল্টিস্টার যুক্ত করেছি।
সুতরাং আমি যে প্রভাবটির জন্য যাচ্ছি তা হ'ল স্টক অ্যান্ড্রয়েড হোমস্ক্রিনের মতো যেখানে আপনি এক থেকে অন্যটিতে স্ক্রোল করতে পারেন এবং যখন আপনি আপনার আঙুলটি তুলবেন তখন এটি একটি স্ক্রিনে যায়।
এটি একটি সমস্যা ব্যতীত সমস্ত দুর্দান্ত কাজ করে: একটি ACTION_UP সর্বদা নিবন্ধ করার জন্য আমাকে বামে থেকে ডানে প্রায় পুরোপুরি অনুভূমিকভাবে সোয়াইপ করতে হবে। যদি আমি খুব স্বল্পত্বে উল্লম্বভাবে সোয়াইপ করি (যা আমি মনে করি যে পাশে থাকা লোকেরা সোয়াইপ করার সময় অনেক লোকই তাদের ফোনে ঝোঁক থাকে) তবে আমি একটি অ্যাকশন_আপের পরিবর্তে একটি অ্যাকশন_সিএনএসএল পাব। আমার তত্ত্বটি হ'ল এটি হ'ল কারণ দিগন্তের স্ক্রোলভিউ একটি স্ক্রোলভিউর মধ্যে রয়েছে এবং স্ক্রোলভিউ উল্লম্ব স্ক্রোলিংয়ের জন্য উল্লম্ব স্পর্শটিকে হাইজ্যাক করছে।
আমার অনুভূমিক স্ক্রোলভিউয়ের মধ্যে থেকে আমি কীভাবে স্ক্রোলভিউয়ের জন্য স্পর্শ ইভেন্টগুলি অক্ষম করতে পারি, তবে তবুও স্ক্রোলভিউয়ের অন্য কোথাও স্বাভাবিক উল্লম্ব স্ক্রোলিংয়ের অনুমতি দেব?
এখানে আমার কোডের একটি নমুনা রয়েছে:
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
গ্রন্থাগার ব্যবহার করছি ।