动画 TextView 高度增加
Animating a TextView height increasing
有人可以post一个简单的例子来说明如何为高度从 0dp 增长到动态值的 TextView 设置动画吗?
我想增加文本视图的高度,但允许用户像动画一样看到它。唯一的条件是我知道我的最大身高是可变的并且在 运行 时间不知道。我想允许的最大值是 100dp。
我试过执行一个简单的 for 循环,例如:
runOnUiThread(new Runnable() {
public void run() {
LayoutParams params = myTextView.getLayoutParams();
int myMaxHeightValue = 100;
for (int x=0; x<myMaxHeightValue; x++) {
params.height = getDensityPixels(x);
myTextView.setLayoutParams(params);
Thread.Sleep(300);
}
}
});
public void getDensityPixels(int value) {
float density = getResources().getDisplayMetrics.display;
return (int) (value * density + 0.5f);
}
谁能提供一个简单的例子,我可以提供最大高度并观察文本视图从 0dp 高度增长到最大 dp 高度?当我使用上面的代码时,它确实增加到 100dp 的最大高度,但是屏幕在调整大小时锁定而不是在它发生时向我显示增加。
非常感谢任何帮助!
您正在通过 运行 您的工作线程锁定您的主线程。要在后台工作时更新 UI,请使用 AsyncTask。 This tutorial 解释了如何做得很好。
基本上,您的 AsyncTask 看起来像这样(上面教程中的示例)
public class DoSomethingTask extends AsyncTask<Void, String, Void> {
private static final String TAG = "DoSomethingTask";
private static final int DELAY = 5000; // 5 seconds
private static final int RANDOM_MULTIPLIER = 10;
@Override
protected void onPreExecute() {
Log.v(TAG, "starting the Random Number Task");
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
//HERE is where you will be doing your UI updates
Log.v(TAG, "reporting back from the Random Number Task");
updateResults(values[0].toString());
super.onProgressUpdate(values);
}
@Override
protected Void doInBackground(Void... params) {
//HERE is where you will be doing your work (your loop)
Log.v(TAG, "doing work in Random Number Task");
String text="";
while (true) {
if (isCancelled()) {
break;
}
int randNum = (int) (Math.random() * RANDOM_MULTIPLIER);
text = String.format(getString(R.string.service_msg), randNum);
//This is how you tell your thread to update the UI
publishProgress(text);
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
Log.v(TAG, "Interrupting the Random Number Task");
}
}
return null;
}
}
切勿使用线程执行 UI/View 动画。 Android 提供了很多动画选项,比如ObjectAnimator, ValueAnimator, View Animator
一个例子,根据您的要求。
private void animateHeight() {
TextView myTextView=null;
int maxInDp = 100;
int maxInPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
maxInDp, mLauncher.getResources().getDisplayMetrics());
ObjectAnimator.ofInt(this, "btnHeight", maxInPx).setDuration(300).start(); // for better animation change duration , and set interpolator.
}
public int btnHeight = 0;
public int getBtnHeight() {
return btnHeight;
}
public void setBtnHeight(int height) {
btnHeight = height;
LayoutParams params = myTextView.getLayoutParams();
params.height = btnHeight;
myTextView.setLayoutParams(params);
}
有人可以post一个简单的例子来说明如何为高度从 0dp 增长到动态值的 TextView 设置动画吗?
我想增加文本视图的高度,但允许用户像动画一样看到它。唯一的条件是我知道我的最大身高是可变的并且在 运行 时间不知道。我想允许的最大值是 100dp。
我试过执行一个简单的 for 循环,例如:
runOnUiThread(new Runnable() {
public void run() {
LayoutParams params = myTextView.getLayoutParams();
int myMaxHeightValue = 100;
for (int x=0; x<myMaxHeightValue; x++) {
params.height = getDensityPixels(x);
myTextView.setLayoutParams(params);
Thread.Sleep(300);
}
}
});
public void getDensityPixels(int value) {
float density = getResources().getDisplayMetrics.display;
return (int) (value * density + 0.5f);
}
谁能提供一个简单的例子,我可以提供最大高度并观察文本视图从 0dp 高度增长到最大 dp 高度?当我使用上面的代码时,它确实增加到 100dp 的最大高度,但是屏幕在调整大小时锁定而不是在它发生时向我显示增加。
非常感谢任何帮助!
您正在通过 运行 您的工作线程锁定您的主线程。要在后台工作时更新 UI,请使用 AsyncTask。 This tutorial 解释了如何做得很好。
基本上,您的 AsyncTask 看起来像这样(上面教程中的示例)
public class DoSomethingTask extends AsyncTask<Void, String, Void> {
private static final String TAG = "DoSomethingTask";
private static final int DELAY = 5000; // 5 seconds
private static final int RANDOM_MULTIPLIER = 10;
@Override
protected void onPreExecute() {
Log.v(TAG, "starting the Random Number Task");
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
//HERE is where you will be doing your UI updates
Log.v(TAG, "reporting back from the Random Number Task");
updateResults(values[0].toString());
super.onProgressUpdate(values);
}
@Override
protected Void doInBackground(Void... params) {
//HERE is where you will be doing your work (your loop)
Log.v(TAG, "doing work in Random Number Task");
String text="";
while (true) {
if (isCancelled()) {
break;
}
int randNum = (int) (Math.random() * RANDOM_MULTIPLIER);
text = String.format(getString(R.string.service_msg), randNum);
//This is how you tell your thread to update the UI
publishProgress(text);
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
Log.v(TAG, "Interrupting the Random Number Task");
}
}
return null;
}
}
切勿使用线程执行 UI/View 动画。 Android 提供了很多动画选项,比如ObjectAnimator, ValueAnimator, View Animator
一个例子,根据您的要求。
private void animateHeight() {
TextView myTextView=null;
int maxInDp = 100;
int maxInPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
maxInDp, mLauncher.getResources().getDisplayMetrics());
ObjectAnimator.ofInt(this, "btnHeight", maxInPx).setDuration(300).start(); // for better animation change duration , and set interpolator.
}
public int btnHeight = 0;
public int getBtnHeight() {
return btnHeight;
}
public void setBtnHeight(int height) {
btnHeight = height;
LayoutParams params = myTextView.getLayoutParams();
params.height = btnHeight;
myTextView.setLayoutParams(params);
}