Android Tween动画修剪边界

时间:2013-06-28 15:10:39

标签: android

我一直试图为这个问题找到一个很好的解决方案,但从来没有能够引用它...所以,希望有人可以帮助我或指出我正确的方向我已经用尽了明年的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

1 个答案:

答案 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,并使用您要设置动画的视图调用该方法,这将为您假冒。