java – Android动画的简单线程问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Android动画的简单线程问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3624字,纯文字阅读大概需要6分钟。
内容图文
我正在尝试用一些简单的Android动画实现一个线程.我只是在睡眠中遇到错误() – 它说我需要一个方法.我知道可能有一个明显的解决方案.我的应用程序只是放置一个随机位置移动的球.我想要的是继续在随机位置放置形状.无论如何,有人可以告诉我我的线程做错了吗?谢谢.
public class DrawingTheBall extends View {
Bitmap bball;
Random randX, randY;
double theta;
Handler m_handler;
Runnable m_handlerTask; //for some reason I get a syntax error here
m_handler = new Handler();
public DrawingTheBall(Context context) {
super(context);
// TODO Auto-generated constructor stub
bball = BitmapFactory.decodeResource(getResources(), R.drawable.blueball);
//randX = 1 + (int)(Math.random()*500);
//randY = 1 + (int)(Math.random()*500);
randX = new Random();
randY = new Random();
theta = 45;
new Thread(this).start();
}
public void onDraw(Canvas canvas){
super.onDraw(canvas);
//Radius, angle, and coordinates for circle motion
float a = 50;
float b = 50;
float r = 50;
int x = 0;
int y = 0;
theta = theta + Math.toRadians(2);
//move ball in circle
if(x < canvas.getWidth()){
x = randX.nextInt() + (int) (a +r*Math.cos(theta));
}else{
x = 0;
}
if(y < canvas.getHeight()){
y = randY.nextInt() + (int) (b +r*Math.sin(theta));
}else{
y = 0;
}
Paint p = new Paint();
}
m_handlerTask = new Runnable()
{
@Override
public void run() {
// do something
m_handler.postDelayed(m_handlerTask, 1000);
invalidate();
}
};
m_handlerTask.run();
}
}
解决方法:
如果实现Thread或HandlerThread,请确保在等待工作线程完成时UI线程不会阻塞 – 不要调用Thread.wait()或Thread.sleep().
http://developer.android.com/training/articles/perf-anr.html
在等待工作线程完成时,主线程应该为其他线程提供一个Handler,以便在完成时回发.
使用处理程序
Handler m_handler;
Runnable m_handlerTask ;
m_handler = new Handler();
m_handlerTask = new Runnable()
{
@Override
public void run() {
// do something
m_handler.postDelayed(m_handlerTask, 1000); // instad of 1000 mention the delay in milliseconds
}
};
m_handlerTask.run();
当你需要取消处理程序时,使用m_handler.removeCallbacks(m_handlerTask);
例:
public class MainActivity extends Activity {
RelativeLayout rl;
int x = 0,y=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rl = (RelativeLayout) findViewById(R.id.rl);
CustomView cv = new CustomView(this);
rl.addView(cv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public class CustomView extends View {
Bitmap bball;
Random randX, randY;
double theta;
Handler m_handler;
Paint p ;
int width;
int height;
Runnable m_handlerTask;
public CustomView(Context context) {
super(context);
// TODO Auto-generated constructor stub
p= new Paint();
bball = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
//randX = 1 + (int)(Math.random()*500);
//randY = 1 + (int)(Math.random()*500);
randX = new Random();
randY = new Random();
theta = 45;
m_handler = new Handler();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
super.onSizeChanged(w, h, oldw, oldh);
width =w;
height=h;
}
public void move()
{
m_handlerTask = new Runnable()
{
@Override
public void run() {
//theta = theta + Math.toRadians(2);
if(x<300)
{
x= x+10;
invalidate();
}
else if(x>300)
{
x=0;
m_handler.removeCallbacks(m_handlerTask);
}
// canvas.drawBitmap(bball, x, y, p);
m_handler.postDelayed(m_handlerTask, 3000);
}
};
m_handlerTask.run();
}
public void onDraw(final Canvas canvas){
super.onDraw(canvas);
canvas.drawBitmap(bball, x, y, p);
if(x<300)
{
move();
}
else
{
m_handler.removeCallbacks(m_handlerTask);
}
}
}
}
内容总结
以上是互联网集市为您收集整理的java – Android动画的简单线程问题全部内容,希望文章能够帮你解决java – Android动画的简单线程问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。