所以,我正在尝试在TextView上创建API级别21的循环显示但我不断收到此错误。起初我以为它与我尝试它的片段的生命周期有关,但后来我在一个活动中尝试了同样的事情但它仍然无法工作。
以下是代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window w = getWindow();
w.setFlags(
WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
w.setStatusBarColor(Color.parseColor("#0277bd"));
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.text);
int a = (tv.getLeft() + tv.getRight()) / 2;
int b = (tv.getTop() + tv.getBottom()) / 2;
int radius = tv.getWidth();
Animator anim = ViewAnimationUtils.createCircularReveal(tv, a, b, 0, radius);
anim.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
}
现在还很早,所以我无法找到任何答案。有什么想法吗?
答案 0 :(得分:15)
您收到错误,因为您传入的视图尚未在屏幕上进行测量和布局。 ViewAnimationUtils.createCircularReveal
需要测量目标视图以计算动画。您还会发现变量a
和b
始终为0。
如果要进行实验,请创建动画并在按钮单击侦听器中启动它。以下是使用代码的示例:
Button button = (Button) findViewById(R.id.your_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView tv = (TextView) findViewById(R.id.text);
int a = (tv.getLeft() + tv.getRight()) / 2;
int b = (tv.getTop() + tv.getBottom()) / 2;
int radius = tv.getWidth();
Animator anim = ViewAnimationUtils.createCircularReveal(tv, a, b, 0, radius);
anim.start();
}
});
答案 1 :(得分:14)
您可以使用Runnable
来制作动画。 Runnable
将在视图创建后运行。无需延迟发布。
view.post(new Runnable()
{
@Override
public void run(){
//create your anim here
}
});
答案 2 :(得分:4)
或者你可以这样做。
tv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
Animator anim = ViewAnimationUtils.createCircularReveal(tv, a, b, 0, radius);
anim.start();
}
});
添加GlobalLayoutListener以等待视图被夸大为我工作。
答案 3 :(得分:-2)
或者你可以这样做。
tv.postDelayed(new Runnable() {
@Override
public void run() {
//start your animation here
}
}, 1000);