0

私は次のことを達成しようとしています

TextViews値 を持つ5-6があるとしますS N A K E

Sここで、 textViewを押してから指をスライドさせて選択し、E に移動して、文字列または文字シーケンスなどでN" " を取得できるようにします。SNAKE

何かアイデアがあれば、私を共有してください。ここの使い方がわかりませんonTouch。また、私はtextViews動的に追加しているので、IDも動的に設定していますよろしくお願いします

4

1 に答える 1

0

やったことはありませんが、ここで考えてみます。

すべてのテキストビューが何らかのレイアウトであると仮定すると、テキストビューのフォーカス機能を無効にして、基礎となるコンテナーに onTouch リスナーを作成できます。

マウス ダウン イベントの追跡を開始する

@Override public boolean onTouch(View v, MotionEvent event) { 
    if(event.getAction == MotionEvent.ACTION_DOWN)
    {
         captureInput = true;
    }
}

*ACTION_MOVEイベントで、現在の位置がテキストビューの上にあるかどうかを確認し、そうであればその値をキャプチャします*

@Override public boolean onTouch(View v, MotionEvent event) { 
    int action = event.getAction();

    if(action == MotionEvent.ACTION_DOWN)
    {
         captureInput = true;
    }
    else if(action == MotionEvent.ACTION_MOVE
    {
        //get x/y of your finger
         int X = (int)event.getX();   
         int Y = (int)event.getY();

        //Somehow check if the x,y are overlapping with one of your textivews
        // If so, add that textview's text to your list
        // Below is pseudo code
        /* for(TextView curTV: allTextViews)
           {
               if(isOverlapping(X,Y))
               {
                   listOfSwipedCharacters.add(curTV.getText());
               }
           }
     }


}

最後に、ユーザーが指を離したら、追跡を停止し、単語リストで何かを行います

@Override public boolean onTouch(View v, MotionEvent event) { 
    int action = event.getAction();

    if(action == MotionEvent.ACTION_DOWN)
    {
         captureInput = true;
    }
    else if(action == MotionEvent.ACTION_MOVE
    {
        //get x/y of your finger
         int X = (int)event.getX();   
         int Y = (int)event.getY();

        //Somehow check which textview the X,Y coords are overlapping
        // Below is pseudo code
        /* for(TextView curTV: allTextViews)
           {
               if(isOverlapping(X,Y))
               {
                   listOfSwipedCharacters += (curTV.getText());
               }
           }*/
     }
     else if(action == MotionEvent.ACTION_UP)
     {
         captureInput = false;
         //Do whatever you want with the string of information that you've captured
     }

}

繰り返しますが、それが機能するかどうかはわかりません。アプローチの推測にすぎません。オーバーラップをチェックするために各テキストビューを循環させるパフォーマンスはかなり悪いと思うので、for ループを実行するよりも効率的なアプローチがあるかもしれません。

スワイプするときに文字を飛び越えることができないことがわかっているので、新しい文字を追加するたびに、可能なすべてのスワイプ位置 (文字を囲む) の短いリストを作成できます。次に、マウスイベントで、これらの文字のいずれかにマウス移動イベントがヒットしたかどうかを確認します。たとえば、標準的な単語検索ゲームでは、文字を選択すると、他にスワイプできる場所 (周囲の文字) が 9 つしかないため、キャプチャ時にそれらの 9 つの場所がヒットしたかどうかのみを確認する必要があります。マウス移動イベント。

編集:onTouchリスナーをすべてのテキストビューにアタッチした場合、上記のソリューションを使用できると思います。タッチに関する同じ前提が適用されます: 下 = キャプチャの開始、移動 = テキストのキャプチャ、上 = キャプチャの停止。onTouch イベントを発生させるテキストビューがユーザーがスワイプしているものになるため、どのテキストビューがホバーされているかを特定する必要がなくなります。

于 2012-05-01T16:20:24.520 に答える