3

私は Android の学習曲線に近づいており、現在はユーザー インターフェイスの詳細に取り組んでいます。私が試みている基本的なことの 1 つは、指で画面上で何かを動かすことです。とても基本的なことのように思えます。

RelativeLayout (RL) から始めて、対照的な背景色を持つ 100x100 のビューを作成し (意図的に単純にしてグラフィックスのオーバーヘッドを低く)、そのビューを RL に追加しました。View.setX と View.setY を使用すると、View をうまく移動できます。

次に、ビューに onTouchListener を追加し、結果の .getRawX および .getRawY 値を使用してビューを移動しました。動作しますが、明確な遅延があります。ビューが私の指のすぐ下にとどまると思っていましたが、遅れをとっています。とても目立ちます。

編集: これが私の onTouch コードです:

    public boolean  onTouch(View v,MotionEvent event) {

        boolean bExitValue = true;
        int     iAction;

        iAction = event.getActionMasked();

        if (MotionEvent.ACTION_MOVE == iAction) {
            v.setX(event.getRawX());
            v.setY(event.getRawY());
        }

        else if (MotionEvent.ACTION_DOWN != iAction) {
            bExitValue = false;
        }

        return(bExitValue);

}

効率を維持するために、onTouch メソッドを可能な限り強化しました。プリミティブのみを使用し、オブジェクトは作成されていません。しかし、それは役に立ちませんでした。さらに試したこと:

  • ビューのサイズを 100x100 から 50x50 に縮小することで、再描画が必要なピクセル数を 75% 削減します。改善なし。

  • onTouchListener を登録する代わりに、View.onTouchEvent をオーバーライドしました。改善なし。

  • マニフェストに android:hardwareAccelerated="true" を追加しました。改善なし。

  • 直感に反するようですが、オンラインで見つけたさまざまなコメントに基づいて、MotionEvent ハンドラーに Thread.sleep() を挿入してみました。改善はありませんが、睡眠値が増加するにつれて、予測可能な速度低下が確実に得られました!

  • 「raw」バージョンの代わりに MotionEvent.getx と .getY を使用しました。絶対的および相対的に見えるインターリーブされた座標のペアを取得したため、ビューが不安定になったため、今のところそれを放棄しましたが、この現在の質問が解決されたら調査します.

新しい Google Nexus 7 でコードを実行しているので、ハードウェアのスループットが不足しているとは思いません。

指で画面上のオブジェクトを移動することは、非常に基本的なことです。私が見ているような遅い反応時間で商用コードを出荷する人は誰もいないので、何かが欠けているに違いありません。

ここをスキャンしましたが、Google で見つけられるものはすべて見つかりましたが、解決策はまだありません。ご指導いただきありがとうございます。

4

1 に答える 1