将按钮(onClick)移动到屏幕上的随机位置

时间:2017-01-11 09:08:55

标签: android animation button

大家。我是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) {
                     }
                 }
            });
        }
    }

请原谅我的任何错误。这是我第一次在这里寻求帮助。

非常感谢您的帮助,感谢您的时间。

1 个答案:

答案 0 :(得分:0)

您应该使用ViewPropertyAnimator。这会将视图设置为其未来位置的动画,并且您不需要在动画结束后强制视图上的任何布局参数。而且它相当简单。

myView.animate().x(50f).y(100f);

myView.animate().translateX(pixelInScreen) 

注意:此像素与视图无关。该像素是屏幕中的像素位置。