Androidでカスタムビューをアニメーション化する簡単な方法を探しています。アニメーターオブジェクトの使用を避けようとしていますが、生のスレッドで作業したいと思います。私が行ったことは、android.view.Viewを拡張するクラスを作成することによってカスタムビューを作成することです。次に、 onDrawメソッドをオーバーライドし、キャンバスを使用して長方形を描画します。縮小したいのは長方形なので、長方形の右側のx値を表す変数を保持します。次に、長方形の右端を時間の経過とともに縮小させたいと思います。私がやりたかったのは、新しいスレッドを作成して開始し、長方形の値を変更することです。View.invalidateを呼び出すまで、ビューが更新されないことを除いて、すべてが機能します。問題は、UIスレッドではないため、生成したスレッドからそれを呼び出せないことです。ハンドラーの使用に関する解決策を読みましたが、それが正しい解決策であるかどうか、そしてそれらの使用方法がまだわかりません。
package com.example.practicum;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
public class TimerControl extends View implements Runnable, Handler.Callback
{
private Paint paint;
private Rect rect;
private Thread t;
private Handler h;
public TimerControl(Context context, AttributeSet attrs)
{
super(context, attrs);
// TODO Auto-generated constructor stub
paint = new Paint();
paint.setColor(Color.BLUE);
rect = new Rect(0,0,60,60);
t = new Thread(this);
t.start();
h = new Handler(this);
//h.post(this);
}
@Override
public void onDraw(Canvas canvas)
{
canvas.drawRect(rect, paint);
}
@Override
public void run()
{
rect.right = rect.right-1;
while(true)
{
rect.right = rect.right-1;
this.invalidate();
try
{
Thread.sleep(5000);
h.sendEmptyMessage(0);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public boolean handleMessage(Message msg)
{
return false;
}
}