大家。我是Android开发的新手,我遇到了一些问题。
正如它在标题中所写,我正在尝试创建一个应用程序,每次单击按钮时,按钮会移动到屏幕上的随机位置。这是一种“失控的按钮”。
这是XML代码。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@color/colorPrimary"
tools:context="com.example.a4ld.MainActivity">
<Button
android:id="@+id/button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button" />
</LinearLayout>
这是主要的活动代码。
起初,解决方案似乎很简单。只需将随机值移动到onClick方法即可。这样,每次单击按钮时都会生成新坐标。但每当我这样做时,animationListener类都无法达到这些值并相应地移动视图,以便按钮的可点击区域与其在屏幕上的位置相匹配。
package com.example.a4ld;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.LinearLayout;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//get display size.
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
final int height = displayMetrics.heightPixels;
final int width = displayMetrics.widthPixels;
//generates random values within display size range.
//doesn't work as intended. the button still goes out of bounds sometimes.
Random n = new Random();
final int height01 = n.nextInt(height - 0) + 0;
Random m = new Random();
final int width01 = m.nextInt(width - 0) + 0;
final Button button01 = (Button) findViewById(R.id.button01);
button01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//animates button movement.
TranslateAnimation animation01 = new TranslateAnimation(0, width01, 0, height01);
animation01.setDuration(500);
animation01.setAnimationListener(new animationListener());
button01.startAnimation(animation01);
}
class animationListener implements Animation.AnimationListener {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
//moves the view(probably) to match the new button position.
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(button01.getWidth(), button01.getHeight());
layoutParams.setMargins(width01, height01, 0, 0);
button01.setLayoutParams(layoutParams);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
}
});
}
}
请原谅我的任何错误。这是我第一次在这里寻求帮助。
非常感谢您的帮助,感谢您的时间。
答案 0 :(得分:0)
您应该使用ViewPropertyAnimator。这会将视图设置为其未来位置的动画,并且您不需要在动画结束后强制视图上的任何布局参数。而且它相当简单。
myView.animate().x(50f).y(100f);
myView.animate().translateX(pixelInScreen)
注意:此像素与视图无关。该像素是屏幕中的像素位置。