2

私が構築しようとしている関連するビューの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これは、mTargetDataonDraw が位置を更新するために使用する、各円の位置の値を保持する単なる 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;
}
4

1 に答える 1

2

この記事に基づいて、解決策は明らかに私を正面から見つめていましたが、実際よりも難しいと思いました。

問題のサンプル アプリケーションの最終的な解決策は、ビューに を実装し、ユーザーが指を離したときにRunnable新しいアニメーションを設定し、 aを使用してオフセットを計算することです。ThreadScroller

@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction();

    if(action == MotionEvent.ACTION_DOWN){
        // ...
    }else if(action == MotionEvent.ACTION_UP){
        // ...

        startAnimation();
        return true;
    }else if(action == MotionEvent.ACTION_MOVE){
        // ...
    }        
    return false;
}
public void run(){
    int start = (int)mMainData.getY();
    int end   = (int)mTargetData.getY();

    mScroller.startScroll(0, start, 0, -Math.round(mMainData.getY() - end), 500);

    while(canAnimate()){
        while(mScroller.computeScrollOffset()){
            mMainData.setY(mScroller.getCurrY());
            postInvalidate();
        }
        stopAnimation();
    }
}
private void startAnimation(){
    mThread = new Thread(this);
    mThread.start();
}
private void stopAnimation(){
    animate = false;
}
private boolean canAnimate(){
    return animate == true;
}
于 2012-10-22T07:53:00.447 に答える