Android - HorizontalScrollView ScrollView Dokunuşla içinde
Tüm ekranı kaydırılan böylece benim bütün düzeni çevreleyen bir ScrollView var. Bu ScrollView içinde ilk öğe yatay olarak kaydırılan aracılığıyla özelliklere sahip HorizontalScrollView bir bloktur. Bu horizontalscrollview bir ontouchlistener işlemek için ekledim dokunma olayları ve kuvvet görünümü "snap" ACTİON_UP olayı en yakın görüntü.
Bu yüzden gidiyorum etkisi birinden diğerine kaydırma yapabileceğiniz, stok android ekranı gibi ve parmağınızı kaldırdığınızda bir ekrana uydurur.
Büyük bir sorun dışında çalışıyor hepsi bu: tokatlamak neredeyse tamamen yatay olarak hiç kaydetmek için bir ACTİON_UP için sağa sola ihtiyacım var. Ben dikey olarak çok az sayıda insanlar yan yana çekerken telefonlarında yapmak eğilimindedir düşünüyorum) tokatlamak, bir ACTİON_UP yerine bir ACTİON_CANCEL alacaksınız. Benim teorim bu horizontalscrollview bir scrollview içinde olduğu ve scrollview dikey dokunmatik dikey kaydırma için izin kaçırma.
Nasıl sadece yatay benim scrollview içinde scrollview için dokunma olaylarını devre dışı bırakın, ama yine de normal dikey kaydırma başka bir yerde izin scrollview miyim?
İş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;
}
}
}
CEVAP
Güncelleme: ben bu işi çözdüm. Benim ScrollView, yalnızca Y hareket ^ ise dokunma olayı yakalamak için onİnterceptTouchEvent yöntemi geçersiz kılmak istedim . X hareket. Bir ScrollView varsayılan davranış, HERHANGİ bir Y hareket olduğunda dokunma olayı müdahale gibi görünüyor. Düzeltmeyi, ScrollView, yalnızca kullanıcı kasıtlı olarak bu durumda Y yönünde ve kaydırma ise olay müdahale çocuklarına ACTİON_CANCEL geçmek.
İşte HorizontalScrollView içeren Kaydırma Görünümü benim sınıf için kod:
public class CustomScrollView extends ScrollView {
private GestureDetector mGestureDetector;
public CustomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(context, new YScrollDetector());
setFadingEdgeLength(0);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
}
// Return false if we're scrolling in the x direction
class YScrollDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return Math.abs(distanceY) > Math.abs(distanceX);
}
}
}
ScrollView içinde liste görünümü Andro...
Ve en sağlam, en basit şekilde kullanı...
Nasıl programlı olarak Android içinde ...
Android bir düzen içinde altı çizili m...
LinearLayout bir ScrollView içinde gen...