これはデバイスの問題であるかコードで問題があるのかわかりませんが、相対レイアウトとイメージビューを使って簡単なドラッグ可能なソート可能なリストを作成しました。私はこのようにするための非常に具体的な理由があり、それは私の質問ではありません。Android/kindleドラッグ時折フリーズフリー
私が抱えている問題は、アプリが完全にフリーズすることがあります。アイテムがドラッグ状態になってしまいます。私が指を持ち上げると、影(ドラッグ)オブジェクトはまだ画面に残っています。画面にタッチすると、その場所に移動します。これは約1分間続き、アプリを殺すか待つかのオプションで応答しないというエラーが表示されます。その後
12-09 14:23:13.157: W/WindowManager(16415): Drag is in progress but there is no drag window handle.
アプリがタイムアウト私はこのエラーメッセージをGoogleで検索し、唯一の情報は無いとの誰かだった
12-09 14:59:09.782: E/ActivityManager(16415): ANR in com.appname.appname (com.appname.appname/.MainActivity)
12-09 14:59:09.782: E/ActivityManager(16415): Reason: keyDispatchingTimedOut
エラーとしてこれを取得するときに次のようにlogcatでのみ有用ビットですリスナを引きずり、他の人がデバイスタッチセンサーがそれを維持していないと言っています。
理想的には、このエラーを修正して、最初にこのエラーが発生しないようにしたいと考えています。私がすぐにドラッグするとほとんどの場合起こるようですが、ユーザーにすぐにドラッグしないように頼むことはできません...そうですか?
また、ドラッグがアプリをフリーズさせてドラッグを中断していることを検出できる方法がありますか。タッチリスナーにタイマーを設定するのと同様に、2〜2回の割り込みのようなドラッグ位置のメッセージがない場合はドラッグしますか?私は方法を知っているタイマーのものですが、凍っている間にドラッグを強制的に停止させる方法はわかりません。何か案は?ここで
はコードです:セットアップタッチで
//happens once when the app loads
RelativeLayout trackList = (RelativeLayout) findViewById(R.id.nsTrackList1);
trackList.setOnDragListener(new MyTrackDragListener(this));
//happens in a loop for each "track" (image view)
trackButton = new ImageView(this);
trackButton.setImageDrawable(nsPackages[trackId].banner[bannerSizeSelector]);
trackButton.setOnTouchListener(new MyTrackTouchListener());
ドラッグオン
public class MyTrackTouchListener implements OnTouchListener {
boolean isDragging=false;
float prevX, prevY;
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getPointerCount() < 2 && !isDragging) return false;
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
isDragging=false;
prevX=0;
prevY=0;
return true;
} else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
if(isDragging) return true;
boolean wasFirst = (prevX == 0 || prevY == 0);
float theTotalDiff = Math.abs(prevX - motionEvent.getX()) + Math.abs(prevY - motionEvent.getY());
prevX=motionEvent.getX();
prevY=motionEvent.getY();
if(wasFirst) return true;
if(theTotalDiff <3) return true;
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
int thisViewId = view.getId();
//hide view
view.setVisibility(View.GONE);
isDragging=true;
return true;
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP || motionEvent.getAction() == MotionEvent.ACTION_CANCEL) {
isDragging=false;
return true;
}else {
Integer thisAction = motionEvent.getAction();
Log.d("looper","Motion action: "+thisAction.toString());
return false;
}
}
}
完全
- を試してみました
いくつかのことは、常に抗力の偽/基本的にリターンのすべての組み合わせが真onDrag
- からfalseを返しますand touch
- 2本の指とAction_Move部分を削除して、代わりにAction_downでドラッグを開始する
同じ結果です。ドラッグ&ドロップは完全に時間の約70%で動作し、突然上述のフリーズ動作を行います。時にはそれは最初の抗力に時にはそれはいくつかの後に時々です。私は、、おそらくのドラッグスピードを除いて一貫したパターンに気づいた。私は素早くドラッグしているが、ドラッグする方向やドラッグする場所は問題にならないと思われる。
以前のアマゾンの従業員とKindleの開発者として、小さなテストアプリで一貫して再解析し、バグレポートを提出することができます。 –
@CarlAndersonありがとう、私は数日の手作業によるテストを試みてきましたが、私はパターンを見ることができません。あなたはこの種の動作のためのテストアプリケーションを構築するためのアドバイスをお持ちですか?タッチ/ドラッグ・ドロップ入力をシミュレートする方法はありますか? – Lenny
私が知っていることは何もありません。残念なことに、あなたが一貫してそれを得ることができないなら、おそらくそれを見ないでしょう。 –