私が構築しようとしている関連するビューのR&D では、簡単なプロジェクトを開始して、先に進む前に基本的な描画の「もの」をさらに行う方法を把握しました。
私の他の質問の状態と同様に、SurfaceView のスレッド化とアニメーションについては多くの情報が公開されていますが、このアプリケーションについてはやり過ぎかもしれません。一度に 10 個からおそらく数百個の最終的なビューを画面に表示します。SurfaceView について収集したことから、通常はアクティビティ (ゲーム画面など) のメイン ビューとして使用されます。
この R&D アプリはいくつかの円を描き、ターゲット (赤い線) と前の位置 (白い線) の間の距離を計算します。
私onDraw
はかなり簡単ですが、ターゲットとメインサークルの間の値を計算するために、スレッドまたはハンドラー、またはあらゆる種類の非 UI ループを実装する方法を理解するのに非常に苦労しています。
簡単だと思ったプライベートな静的内部スレッドがありますが、サイコロはありません。最新のフランケンコード:
private static class DragThread extends Thread {
private DragTest view;
private boolean animate;
private float currentY, targetY, delta, inc;
public DragThread(View v){
view = (DragTest)v;
targetY = view.mTargetData.getY();
currentY = view.mMainData.getY();
}
public void run(){
while(Math.abs(currentY - targetY) >= 0){
view.mMainData.setY(currentY + 10f);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}finally{
view.postInvalidate();
}
}
Log.e(TAG, "Loop finished");
}
}
mMainData
これは、mTargetData
onDraw が位置を更新するために使用する、各円の位置の値を保持する単なる POJO です。
mMainData = new CircleData(startXposition, startYposition, radius);
...標準の getter を使用して取得します。
基本的に、指を離したときにループ ロジックを開始する必要があることはわかっていますが、「Thread Already Started」からフリーズやクラッシュまで、いくつかのエラーが発生しました。ハンドラーはリーク警告を出します...男。私は過ごしました。
onTouchEvent
各イベントの説明とともに、私の見解は次のとおりです。
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if(action == MotionEvent.ACTION_DOWN){
// set some flags for drawing, update "hero" circle Y position
// based off event data
}else if(action == MotionEvent.ACTION_UP){
// reset flags that dictate ghost circle drawing, etc. and invalidate
// I think I need to start the loop here, but how?!
// new Thread().start()? Some sort of Handler? GAH!
}else if(action == MotionEvent.ACTION_MOVE){
// update mMainData Y position which is passed into onDraw, invalidate to reflect movement changes
}
return false;
}