以下程序实现了显示一个图片:
请教 run()中的handler.post(new Runnable()这个是在线程中启动了一个新的线程,然后这个线程
在不停地运行invalidate();
1 handler.post究竟是什么概念?
2 为什么要这样做?我试了写一个invalidate();是不可以的。public class MovingPictureView extends View implements Runnable{
//用于显示的图片
Bitmap bitmap;
//图片坐标转化的线程是否运行,false,则停止运行
boolean isRuning = true;
//图片的Left,Top值
int left = 0;
int top = 0;
//用于同步线程
Handler handler;
//向量,可以通过调节此两个变量调节移动速度
int dx = 1;
int dy = 1;
public MovingPictureView(Context context) {
super(context);
setFocusable( true );
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
handler = new Handler();
new Thread(this).start();
}
@Override
protected void onDraw(Canvas canvas) {
//将图画到画板上
canvas.drawBitmap(bitmap, left,top, null);
}
@Override
public void run() {
while(isRuning){
handler.post(new Runnable() {
@Override
public void run() {
invalidate();
}
});
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
请教 run()中的handler.post(new Runnable()这个是在线程中启动了一个新的线程,然后这个线程
在不停地运行invalidate();
1 handler.post究竟是什么概念?
2 为什么要这样做?我试了写一个invalidate();是不可以的。public class MovingPictureView extends View implements Runnable{
//用于显示的图片
Bitmap bitmap;
//图片坐标转化的线程是否运行,false,则停止运行
boolean isRuning = true;
//图片的Left,Top值
int left = 0;
int top = 0;
//用于同步线程
Handler handler;
//向量,可以通过调节此两个变量调节移动速度
int dx = 1;
int dy = 1;
public MovingPictureView(Context context) {
super(context);
setFocusable( true );
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
handler = new Handler();
new Thread(this).start();
}
@Override
protected void onDraw(Canvas canvas) {
//将图画到画板上
canvas.drawBitmap(bitmap, left,top, null);
}
@Override
public void run() {
while(isRuning){
handler.post(new Runnable() {
@Override
public void run() {
invalidate();
}
});
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
解决方案 »
- android中的双向seekbar
- 这样的效果怎样实现呢
- [Android:Bluetooth]请教各位达人,bluetoothDock是什么
- 求android项目使用maven的意义?
- 计算器里的删除键
- 请问九宫格解锁中划线是怎么实现的??
- onCreateOptionsMenu和onOptionsItemSelected 如何固定菜单??
- 求安卓快速拍照代码
- 很紧急!!Unable to execute dex: Multiple dex files define ???
- 一个安卓编程问题
- Android.os.MemoryFile的问题?
- Android调用.net webservice实现图片上传
Since: API Level 1
Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached. Parameters
r The Runnable that will be executed. Returns
Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.
各位大侠,小可对线程的概念还不是很明了,可能就是因为这个理解不了handler。以上是handler.post的解释,是把当前的线程r加入到执行队列中,是吗?那么在这个while循环中新开一个线程究竟又是什么意思呢?为什么还要套一个while循环?为什么要新开一个线程?望高人指点!
thread在start时就是启动一个新的子线程,为什么用post,这个不好说,因为大可只用handler的sendmessage来实现更新的。handler已经和UI线程(也就是主线程)绑定了,就可以直接进行UI的更新。
handler.post(Runnable) 中的Runnable 会在handler 所在的线程执行, 也就是View 所在的UI线程, 所以调用 Invalidate()方法是很合适的。
如果用5楼说的, sendmessage 实现应该也是可以的。
Runnable本身不是线程。
1、UI是最线程,其它线程是无法和UI主线程交互的,handler.post(Runnable r)是为了让Runnable 具有这一功能,可以看到在run()方法中调用了invalidate()方法
2、问什么要一直while,大家都知道不管是游戏还是电影什么的其实都是由很多张图片不同的切换才具备了动画的效果,invalidate()就是为了做这么件事,当每次调用invalidate()时,系统会去回调onDraw()方法,也就是一帧了。
h = new Handler(Looper l)//l为主线程的Looper。此时h为l所附属的handler,h的消息由post放在l的线程的队列中,由l所在的线程处理消息。
嗯,应该是这样的。