我一直试图为这个问题找到一个很好的解决方案,但从来没有能够引用它...所以,希望有人可以帮助我或指出我正确的方向我已经用尽了明年的Google配额。
基本上,我想要完成的是单个视图的ScaleAnimation,当Long Clicked,将展开然后收缩以表示它已被按下。
这就是所有设置;没问题。
问题是ScaleAnimation被视图的父级剪切,并且不会扩展到其父级。这是层次结构:
Relative >
Relative >
Linear > (<-- The animation is cut at the outer bounds of this parent)
View
我尝试添加android:clipChildren =“false”和android:clipPadding =“false”,但这些解决方案都没有帮助我在第一个父级的边界外实际制作动画。
据我所知,补间动画的设计不会延伸到动画视图所在的视图边界之外,但是它是不可能的,可以在Draggable Views这样的东西中看到吗?
或者我只是接近这种情况完全错了?
如何实际超出第一个父母边界的动画?
提前感谢您的帮助, -Matt
答案 0 :(得分:0)
我能够提出的唯一解决方案,尽管很黑,但仍有效。
父亲是一个RelativeLayout,我有一个隐藏的自定义TextView z位于其他内容之上。当我需要调用动画时,我给TextView提供与我需要动画的视图相同的LayoutParams / background / text,将其设置为View.VISIBLE,为其设置动画,并在动画完成时将其设置回View.GONE :
public void doAnimation(final View v){
v.setId(5);
final CustomTextView animatorImage = (CustomTextView) ((MainActivity)mActivity).findViewById(R.id.pick_animator_image); // Our hidden TextView in the FrameLayout
try{
animatorImage.setBackgroundDrawable(v.getBackground());
animatorImage.setText(((TextView)v).getText().toString());
animatorImage.setTextColor(((TextView)v).getCurrentTextColor());
animatorImage.setTextSize(TypedValue.COMPLEX_UNIT_PX, ((TextView)v).getTextSize());
}
catch(Exception e){
}
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(v.getWidth(), v.getHeight());
int[] windowLocation = new int[2];
v.getLocationInWindow(windowLocation);
params.leftMargin = (int) windowLocation[0];
params.topMargin = (int) windowLocation[1] - ((MainActivity)mActivity).getSupportActionBar().getHeight() - getStatusBarHeight(); // Subtract the ActionBar height and the StatusBar height if they're visible
animatorImage.setLayoutParams(params);
animatorImage.setVisibility(View.VISIBLE);
v.setVisibility(View.INVISIBLE);
ScaleAnimation scaleAnim = new ScaleAnimation(1f, 2.5f, 1f, 2.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnim.setDuration(300);
scaleAnim.setZAdjustment(Animation.ZORDER_TOP);
scaleAnim.setAnimationListener(new AnimationListener(){
public void onAnimationEnd(Animation arg0) {
ScaleAnimation scaleAnim2 = new ScaleAnimation(2.5f, 1f, 2.5f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnim2.setDuration(300);
scaleAnim2.setZAdjustment(Animation.ZORDER_TOP);
scaleAnim2.setAnimationListener(new AnimationListener(){
public void onAnimationEnd(Animation animation) {
animatorImage.clearAnimation();
v.setVisibility(View.VISIBLE);
animatorImage.setVisibility(View.GONE);
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationStart(Animation animation) {
}});
animatorImage.startAnimation(scaleAnim2);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationStart(Animation animation) {
}});
animatorImage.bringToFront();
animatorImage.startAnimation(scaleAnim);
}
XML层次结构是:
RelativeLayout (parent)
ViewGroup (main content body)
TextView (hidden View to animate)
只需将“R.id.pick_animator_image”更改为RelativeLayout中TextView的ID,并使用您要设置动画的视图调用该方法,这将为您假冒。