SORU
15 NİSAN 2010, PERŞEMBE


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
16 NİSAN 2010, Cuma


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);
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Boiler Room

    Boiler Room

    10 Mayıs 2012
  • cekehechu

    cekehechu

    20 HAZİRAN 2006
  • MyTiredBones

    MyTiredBones

    2 Temmuz 2013