0

タイマーのテキスト コントロールを更新するサンプル コードを彼女から入手しました。次に、カスタム ビューを作成し、onDraw をオーバーライドして、ビューのアニメーションを作成できるようにしました。カスタム ビューには、タイマーがオフになるたびに 1 ピクセル下に移動するだけのビットマップがあり、それが機能するようになると、より洗練されたものになります。

タイマー呼び出しからカスタム ビューを無効にすることを考えていたので、OnDraw 関数が呼び出されます。しかし、それがタイマーから来ているのかどうかはわかりません。つまり、ビットマップを移動する必要があるのか​​ 、それともアンドロイドが画面を更新しているだけなのかはわかりません。

これを行う最良の方法は何ですか?タイマー付きコード

package besttecksolutions.tellafortune;

/////////////
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Handler.Callback;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class cShuffle2  extends Activity   {
    TextView text3;
    long starttime = 0;
    //this  posts a message to the main thread from our timertask
    //and updates the textfield

   //runs without timer be reposting self
   Handler h2 = new Handler();
   Runnable run = new Runnable() {

        @Override
        public void run() {
           long millis = System.currentTimeMillis() - starttime;
           int seconds = (int) (millis / 1000);
           int minutes = seconds / 60;
           seconds     = seconds % 60;

           text3.setText(String.format("%d:%02d", minutes, seconds));

           h2.postDelayed(this, 500);
        }
    };

      @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.shuffle2);

        text3 = (TextView)findViewById(R.id.text3);



        h2.postDelayed(run, 0);

        LinearLayout layout = (LinearLayout)findViewById(R.id.mainLayout);


        // Add the adView to it
        cShuffleView2 myView;
        myView=new cShuffleView2(this);
            layout.addView(myView);

    }

}

アニメーションを行うカスタム ビュー クラス

package besttecksolutions.tellafortune;



import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import java.io.InputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.content.Intent;
import android.content.Context;

import android.os.Bundle;
import android.view.View;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.view.*;
import android.view.View.OnClickListener;

public class cShuffleView2 extends View {

 View t;
 Bitmap icon;

 cShuffleView2( Context context)
    {
        super(context);


        // load in bitmaps
        try {
        AssetManager assetManager= context.getAssets();
       InputStream inputStream;
       inputStream=assetManager.open("bio.png");  
       icon=BitmapFactory.decodeStream(inputStream);
       inputStream.close();
        } catch( IOException e)
        {

        }

    }

 protected void onDraw( Canvas canvas)
    {
    Paint color = new Paint();
    color.setColor(0xffffff00);
    canvas.drawRect(0,0, getWidth(),getHeight(),color);
    canvas.drawBitmap(icon, 100,100,null);

    }
}
4

1 に答える 1

0

パブリックブールフィールド、またはget / setを使用してプライベートを作成し、タイマーコールバックでtrueに設定します(例:myView.updateBitmap = true;)。onDrawでは、次のことをテストできます。

if (this.updateBitmap){

    // update bitmap
    this.updateBitmap = false;

}

updateBitmapは、タイマーコールバックで設定されている場合にのみtrueになります(他の場所で使用しない場合)。

さらに良いのは、拡張ビューに独自のコールバックを実装し、タイマーから直接呼び出すことです。

于 2012-06-05T16:12:14.197 に答える