Java Android:尝试在两个动画之间添加等待,在等待之前获取未被线程锁定的对象()错误
我不熟悉Android和Java编程。我为Coursera课程创建了一个应用程序。它有两个重复出现的动画。我想让它们像鼓的拍子一样动起来-1,2,1,2,1,2,1,2,1,2 我编写了两个递归方法,在用户单击重置按钮之前一直运行。我尝试在方法调用之间添加一个等待,以便第二个方法调用将在第一个方法调用之后立即启动 这是我的代码中有等待的部分Java Android:尝试在两个动画之间添加等待,在等待之前获取未被线程锁定的对象()错误,java,android,multithreading,wait,Java,Android,Multithreading,Wait,我不熟悉Android和Java编程。我为Coursera课程创建了一个应用程序。它有两个重复出现的动画。我想让它们像鼓的拍子一样动起来-1,2,1,2,1,2,1,2,1,2 我编写了两个递归方法,在用户单击重置按钮之前一直运行。我尝试在方法调用之间添加一个等待,以便第二个方法调用将在第一个方法调用之后立即启动 这是我的代码中有等待的部分 mHandler = new Handler(); // .os package class when importing mLeftfoo
mHandler = new Handler(); // .os package class when importing
mLeftfoot = findViewById(R.id.leftfoot);
mRightfoot = findViewById(R.id.rightfoot);
mFootAnim = AnimationUtils.loadAnimation(this, R.anim.foot); //this looks to the foot.xml file for the animations
leftstepRecursive();
try {
wait(600);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rightstepRecursive();
这部分代码展示了递归方法,据我所知,这些方法可能编写得更好。很多干燥的
private void leftstepRecursive() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mLeftfoot.startAnimation(mFootAnim);
if (!pleaseStop)
leftstepRecursive();
}
}, mIntervalleft);}
private void rightstepRecursive() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mRightfoot.startAnimation(mFootAnim);
if (!pleaseStop)
rightstepRecursive();
}
}, mIntervalright);
有没有更好的方法来实现这个左,右,左,右,左,右,左,右,左,右,想法
或者,我能做些什么来纠正等待
我也试过:
private void rightstepRecursive() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Object testobj = mRightfoot.startAnimation(mFootAnim);
synchronized (testobj) {
testobj.wait(600);
}
if (!pleaseStop)
rightstepRecursive();
}
}, mIntervalright);
@路易吉门多萨。我试着去睡觉。没有错误,但两个动画同时移动不确定原因
private void rightstepRecursive() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mRightfoot.startAnimation(mFootAnim);
if (!pleaseStop)
rightstepRecursive();
}
}, mIntervalright);
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
我也在Logcat中重复了这个消息
02-11 12:15:32.261: I/Choreographer(30480): Skipped 302 frames! The application may be doing too much work on its main thread.
您应该真正利用框架和它提供的一些类,例如s和s。动画框架提供了许多功能,可以真正简化您尝试执行的操作,即重复动画、添加延迟、计时动画等 下面是一个非常简单的示例,给出了基本的想法:
AnimatorSet animations;
//Play the animation
private void playAnimation(){
//If they haven't stopped the animation, loop it.
ObjectAnimator anim1 = ObjectAnimator.ofFloat(target, propertyName, values);
ObjectAnimator anim2 = ObjectAnimator.ofFloat(target, propertyName, values);
animations = new AnimatorSet();
animations.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
playAnimation();
}
});
animations.play(anim1).before(anim2);
animations.start();
}
//Called when cancel is selected
private void stopAnimation(){
animations.end();
}
我不确定在这种情况下是否应该使用
wait
或Thread.sleep
。请参阅上面的我的Thread.sleep…它不起作用。两个动画同时发生。我希望mRightfoot在mLeftfoot后500毫秒启动。请不要在问题标题前加上Android
,底部的标签已经足够了。您不想使用Thread.sleep()
或wait
(需要同步,请参阅)。启动正确的方法不需要实际睡眠,只需使用相同的处理程序
方法在调用左侧动画的行之后发布延迟消息(600毫秒后),在延迟的可运行
中,只需调用要在600毫秒后启动的正确方法即可。Luksprog。谢谢好的,没有更多的Android前缀。你能发布你的代码示例吗。你的回答应该得到表扬。哦,我的意思是发布任何答案,而不是评论。你应该得到信用而不是被淹没。他/她的回答很有帮助,但不会直接用我发布的代码解决我当前的问题。谢谢,乍一看,处理程序/递归方法代码似乎更容易理解。在我的代码中,实际动画在foot.xml中,在那里很容易更改动画(滑动、不透明)。在代码中,在哪里处理实际动画?目标、propertyName、值?目标是对象,因此您的视图、propertyName是您正在制作的动画…因此,这可以是“x”或“y”等,而值是您的开始和结束值,或者只是结束值(如果您只指定一个值,则将其视为结束值)。这些都在文档中。另外,请注意,您也可以在xml中创建objectAnimators。不确定您是否仍在检查这一点,但我使用递归方法修复了其他方法。在您的示例中,我将在何处控制anim1和anim2之间的间隔/速度?通过设置自定义/不同的插值器,请参见设置插值器