Tüm ekranın kaydırılabilir olması için tüm düzenimi çevreleyen bir ScrollView var. Bu ScrollView'da sahip olduğum ilk öğe, yatay olarak kaydırılabilen özelliklere sahip bir HorizontalScrollView bloğudur. Dokunma olaylarını işlemek ve görünümü ACTION_UP olayındaki en yakın görüntüye "yapışmaya" zorlamak için yatay kaydırma görünümüne bir onto-listenener ekledim.
Bu yüzden gideceğim etki, birinden diğerine geçebileceğiniz hisse senedi android ana ekranı gibidir ve parmağınızı kaldırdığınızda bir ekrana yaslanır.
Bu bir sorun dışında tüm harika çalışıyor: Bir ACTION_UP hiç kayıt için hemen hemen yatay olarak soldan sağa hızlıca kaydırmak gerekiyor. En azından dikey olarak kaydırırsam (birçok kişinin yan yana kaydırırken telefonlarında yapma eğiliminde olduğunu düşünüyorum), ACTION_UP yerine bir ACTION_CANCEL alırım. Benim teorim, bunun nedeni yatay kaydırma görüntüsünün bir kaydırma görüntüsü içinde olması ve kaydırma görüntüsünün dikey kaydırmaya izin vermek için dikey dokunuşu ele geçirmesidir.
Kaydırma görünümünün dokunma olaylarını yatay kaydırma görünümümden nasıl devre dışı bırakabilirim, ancak yine de kaydırma görüntüsünün başka bir yerinde normal dikey kaydırmaya izin verebilirim?
İşte benim kod bir örnek:
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
) burada velir.com/blog/index.php/2010/11/17/… Özel kaydırma sınıfı oluşturuldukça neler olduğu hakkında ek yorumlar var.
MeetMe's HorizontalListView
Kütüphane kullanıyorum .