如何为摇动事件中的文本制作动画
How to Animate Text from a Shake Event
我目前有一个允许用户摇动 phone 的应用程序,不同的文本会从一个数组中出现。但是,文本一直显示得太快,如果用户不断摇动 phone,文本就会不断变化。我该怎么做:
1) 将文本设置为动画,以便在 phone 摇动后,文本会慢慢淡出?
- 如何实现摇动延迟,以便用户在摇动之前等待几秒钟phone?
我已经为单击的按钮实现了此功能,但似乎无法与 Sensor Manager 一起使用。
protected final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
float z = sensorEvent.values[2];
acelLast = acelVal;
acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = acelVal - acelLast;
shake = shake * 0.9f + delta;
if (shake > 12) {
int randomNum = new Random().nextInt(answersArray.length);
ball_text.setText(answersArray[randomNum]);
ball_text.setVisibility(View.VISIBLE);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
// Sensor Section //
- 您需要为文本视图的 alpha 值变化设置动画。
- 您需要记录用户上次摇晃的时间并将其用于检查。
按照以下几行应该可以工作,
long previousTime = 0;
protected final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
float z = sensorEvent.values[2];
acelLast = acelVal;
acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = acelVal - acelLast;
shake = shake * 0.9f + delta;
if (shake > 12) {
//Fade in text if difference between previous and current time is > 2 seconds
if (System.currentTimeMillis() - previousTime > 2000) {
previousTime = System.currentTimeMillis();
//Use AlphaAnimation
Animation fadeInAnimation = new AlphaAnimation(0, 1);
fadeInAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
int randomNum = new Random().nextInt(answersArray.length);
ball_text.setText(answersArray[randomNum]);
ball_text.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animation animation) {}
@Override
public void onAnimationRepeat(Animation animation) {}
});
fadeInAnimation.setInterpolator(new DecelerateInterpolator());
fadeInAnimation.setDuration(1000);
ball_text.startAnimation(fadeInAnimation);
/*
//This should work, but it doesn't, I'll prob tinker with it on some weekend, I'll update the answer if I figure out the issue
ball_text.animate()
.withStartAction(new Runnable() {
@Override
public void run() {
int randomNum = new Random().nextInt(answersArray.length);
ball_text.setText(answersArray[randomNum]);
ball_text.setAlpha(0f);
ball_text.setVisibility(View.VISIBLE);
}
})
.alpha(1f)
//Fade in over a duration of 1 second
.setDuration(1000)
.start()
*/
} else {
//If it's less than 2 seconds since last shake, inform user to wait
//For eg,
Toast.makeText(context, "Wait mate", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
我目前有一个允许用户摇动 phone 的应用程序,不同的文本会从一个数组中出现。但是,文本一直显示得太快,如果用户不断摇动 phone,文本就会不断变化。我该怎么做:
1) 将文本设置为动画,以便在 phone 摇动后,文本会慢慢淡出?
- 如何实现摇动延迟,以便用户在摇动之前等待几秒钟phone?
我已经为单击的按钮实现了此功能,但似乎无法与 Sensor Manager 一起使用。
protected final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
float z = sensorEvent.values[2];
acelLast = acelVal;
acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = acelVal - acelLast;
shake = shake * 0.9f + delta;
if (shake > 12) {
int randomNum = new Random().nextInt(answersArray.length);
ball_text.setText(answersArray[randomNum]);
ball_text.setVisibility(View.VISIBLE);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
// Sensor Section //
- 您需要为文本视图的 alpha 值变化设置动画。
- 您需要记录用户上次摇晃的时间并将其用于检查。
按照以下几行应该可以工作,
long previousTime = 0;
protected final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
float z = sensorEvent.values[2];
acelLast = acelVal;
acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = acelVal - acelLast;
shake = shake * 0.9f + delta;
if (shake > 12) {
//Fade in text if difference between previous and current time is > 2 seconds
if (System.currentTimeMillis() - previousTime > 2000) {
previousTime = System.currentTimeMillis();
//Use AlphaAnimation
Animation fadeInAnimation = new AlphaAnimation(0, 1);
fadeInAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
int randomNum = new Random().nextInt(answersArray.length);
ball_text.setText(answersArray[randomNum]);
ball_text.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animation animation) {}
@Override
public void onAnimationRepeat(Animation animation) {}
});
fadeInAnimation.setInterpolator(new DecelerateInterpolator());
fadeInAnimation.setDuration(1000);
ball_text.startAnimation(fadeInAnimation);
/*
//This should work, but it doesn't, I'll prob tinker with it on some weekend, I'll update the answer if I figure out the issue
ball_text.animate()
.withStartAction(new Runnable() {
@Override
public void run() {
int randomNum = new Random().nextInt(answersArray.length);
ball_text.setText(answersArray[randomNum]);
ball_text.setAlpha(0f);
ball_text.setVisibility(View.VISIBLE);
}
})
.alpha(1f)
//Fade in over a duration of 1 second
.setDuration(1000)
.start()
*/
} else {
//If it's less than 2 seconds since last shake, inform user to wait
//For eg,
Toast.makeText(context, "Wait mate", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};