2

あなたからアイデアを得られることを期待して、このかなり複雑な質問をしています。

これが問題です:上記のカスタムリストビュークラスを作成しました:

public class FolderListView extends ListView {

    private float xDistance, yDistance, lastX, lastY;
    private int folder_index;
    private FolderViewInterface openFolder;

    // private boolean swiping = false;

    // If built programmatically
    public FolderListView(Context context) {
        super(context);
    }

    // This example uses this method since being built from XML
    public FolderListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    // Build from XML layout
    public FolderListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {

        case MotionEvent.ACTION_UP:
            // if (swiping == false) {

            //if (xDistance > yDistance)
            //  return false;
        //  else {
                folder_index = pointToPosition((int) lastX, (int) lastY);
            //  Toast.makeText(getContext(),
            //          "You pressed a folder with index: " + folder_index,
            //          Toast.LENGTH_SHORT).show();
        //  }
            HomeScreenFragment f = new HomeScreenFragment();
            openFolder = (FolderViewInterface) f;
            openFolder.onFolderOpened(folder_index);
            // }
            // swiping = false;
            break;

        case MotionEvent.ACTION_DOWN:
            // swiping = false;
            xDistance = yDistance = 0f;
            lastX = ev.getX();
            lastY = ev.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            // swiping = true;
            final float curX = ev.getX();
            final float curY = ev.getY();
            xDistance += Math.abs(curX - lastX);
            yDistance += Math.abs(curY - lastY);
            lastX = curX;
            lastY = curY;
            if (xDistance > yDistance)
                return false;
        }

        return super.onInterceptTouchEvent(ev);

    }

}

ここにあるのは、タッチイベントを適切に検出することです。タッチして他のフラグメントを開きたいのですが、現在、フラグメントはタッチとスワイプの両方で開かれています。

リストの要素はビューページャーであり、スクロール時に適切に動作しなかったため、onInterceptTouchEvent を使用しました。

スワイプを検出し、この部分を実行しないために、ここに何らかのロジックが必要です。

HomeScreenFragment f = new HomeScreenFragment();
            openFolder = (FolderViewInterface) f;
            openFolder.onFolderOpened(folder_index);

イベントがスワイプ イベントではなく、タッチ イベントである場合のみ。

どんな種類の提案/ヘルプも大歓迎です。詳細が必要な場合はお知らせください。

ありがとう!

4

3 に答える 3

2

PRESSED_STATE_DURATIONtimeに基づいて125 を取得しています

これを試して

//Declare as instance variables
int oldX,oldY,newX,newY;
//State the minimum distance of swipe that you forgive the user for ;)
int distance = 10;
int time = 125;
boolean cancel = false;
case MotionEvent.ACTION_DOWN:
cancel = false;
//Get x and y of touch
oldX = ev.getX();
oldY = ev.getY();
startActionTimer();

case MotionEvent.ACTION_MOVE:
//Get x and y of touch
newX = ev.getX();
newY = ev.getY();

case MotionEvent.ACTION_UP:
cancel = true;

private void startActionTimer(){
        //time is pressed state duration
          new CountDownTimer(time, time) {
             public void onTick(long millisUntilFinished) {}

             public void onFinish() {
                //Time to do our action!!!
                // please consider
                if((Math.abs(newX - oldX )< distance) && (Math.abs(newY - oldY ) <distance)){
                    if(cancel == false){
                    // Now its a touch so do your action
                    }
                }
             }
          }.start();
     }

注:問題を回避するために、すべての変数をクラス変数 (インスタンス変数) として使用してください。値が適切に更新されないという奇妙な状況が時々発生するため

また

ジェスチャー検出を試してみませんか

onSingleTapUpメソッドをオーバーライドします

于 2013-08-05T12:41:38.913 に答える
0

これが私の質問に対する答えです。私は最終的にそれを理解しました。ブール変数を使用して、スワイプがいつ実行されたかを確認し、スワイプしていないときに適切なことを行う必要がありました。それは非常に敏感であるため(ほんのわずかなスワイプの試みでも検出する)、最善の解決策ではありませんが、それでも何かです.

助けてくれてありがとう!

これが私の更新されたコードです:

package ro.gebs.captoom.utils;

import ro.gebs.captoom.fragments.HomeScreenFragment;
import ro.gebs.captoom.interfaces.FolderViewInterface;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;

public class FolderListView extends ListView {

    private float xDistance, yDistance, lastX, lastY;
    private int folder_index;
    private FolderViewInterface openFolder;

    private boolean swiping = false;

    // If built programmatically
    public FolderListView(Context context) {
        super(context);
    }

    // This example uses this method since being built from XML
    public FolderListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    // Build from XML layout
    public FolderListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {

        case MotionEvent.ACTION_UP:
            folder_index = pointToPosition((int) lastX, (int) lastY);
            if (!swiping) {
                HomeScreenFragment f = new HomeScreenFragment();
                openFolder = (FolderViewInterface) f;
                openFolder.onFolderOpened(folder_index);
            }
            swiping = false;
            break;

        case MotionEvent.ACTION_DOWN:
            xDistance = yDistance = 0f;
            lastX = ev.getX();
            lastY = ev.getY();

            break;
        case MotionEvent.ACTION_MOVE:
            final float curX = ev.getX();
            final float curY = ev.getY();
            xDistance += Math.abs(curX - lastX);
            yDistance += Math.abs(curY - lastY);
            lastX = curX;
            lastY = curY;
            if (xDistance > yDistance) {
                swiping = true;
                System.out.println("I AM HEREEEEEE");
                return false;
            }

        }

        return super.onInterceptTouchEvent(ev);

    }

}
于 2013-08-05T13:48:46.363 に答える