【问题标题】:changing background opacity (alpha level) sequentially android依次改变背景不透明度(alpha级别)android
【发布时间】:2016-07-07 02:35:12
【问题描述】:
private void zoomImageFromThumb(final View thumbView, int imageResId){

    // If there's an animation in progress, cancel it
    // immediately and proceed with this one.
    if (mCurrentAnimator != null) {
        mCurrentAnimator.cancel();
    }
    Drawable expanded_image_background=getResources().getDrawable(R.drawable.background_expanded_image);



    // Load the high-resolution "zoomed-in" image.
    final ImageView expandedImageView = (ImageView) findViewById(R.id.expanded_image);
    expandedImageView.setImageResource(imageResId);
    expandedImageView.bringToFront();

    // Calculate the starting and ending bounds for the zoomed-in image.
    // This step involves lots of math. Yay, math.
    final Rect startBounds = new Rect();
    final Rect finalBounds = new Rect();
    final Point globalOffset = new Point();

    // The start bounds are the global visible rectangle of the thumbnail,
    // and the final bounds are the global visible rectangle of the container
    // view. Also set the container view's offset as the origin for the
    // bounds, since that's the origin for the positioning animation
    // properties (X, Y).
    thumbView.getGlobalVisibleRect(startBounds);
    findViewById(R.id.container).getGlobalVisibleRect(finalBounds, globalOffset);
    startBounds.offset(-globalOffset.x, -globalOffset.y);
    finalBounds.offset(-globalOffset.x, -globalOffset.y);

    // Adjust the start bounds to be the same aspect ratio as the final
    // bounds using the "center crop" technique. This prevents undesirable
    // stretching during the animation. Also calculate the start scaling
    // factor (the end scaling factor is always 1.0).
    float startScale;
    if ((float) finalBounds.width() / finalBounds.height()
            > (float) startBounds.width() / startBounds.height()) {
        // Extend start bounds horizontally
        startScale = (float) startBounds.height() / finalBounds.height();
        float startWidth = startScale * finalBounds.width();
        float deltaWidth = (startWidth - startBounds.width()) / 2;
        startBounds.left -= deltaWidth;
        startBounds.right += deltaWidth;
    } else {
        // Extend start bounds vertically
        startScale = (float) startBounds.width() / finalBounds.width();
        float startHeight = startScale * finalBounds.height();
        float deltaHeight = (startHeight - startBounds.height()) / 2;
        startBounds.top -= deltaHeight;
        startBounds.bottom += deltaHeight;
    }

    // Hide the thumbnail and show the zoomed-in view. When the animation
    // begins, it will position the zoomed-in view in the place of the
    // thumbnail.
    thumbView.setAlpha(0f);
    expandedImageView.setVisibility(View.VISIBLE);

    // Set the pivot point for SCALE_X and SCALE_Y transformations
    // to the top-left corner of the zoomed-in view (the default
    // is the center of the view).
    expandedImageView.setPivotX(0f);
    expandedImageView.setPivotY(0f);

    // Construct and run the parallel animation of the four translation and
    // scale properties (X, Y, SCALE_X, and SCALE_Y).
    AnimatorSet set = new AnimatorSet();
    set.play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left, finalBounds.left))
            .with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top, finalBounds.top))
            .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X,
                    startScale, 1f)).with(ObjectAnimator.ofFloat(expandedImageView,
            View.SCALE_Y, startScale, 1f));
    set.setDuration(mShortAnimationDuration);
    set.setInterpolator(new DecelerateInterpolator());
    set.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            mCurrentAnimator = null;
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            mCurrentAnimator = null;
        }
    });
    set.start();
    mCurrentAnimator = set;

    // Upon clicking the zoomed-in image, it should zoom back down
    // to the original bounds and show the thumbnail instead of
    // the expanded image.
    final float startScaleFinal = startScale;
    expandedImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mCurrentAnimator != null) {
                mCurrentAnimator.cancel();
            }

            // Animate the four positioning/sizing properties in parallel,
            // back to their original values.
            AnimatorSet set = new AnimatorSet();
            set.play(ObjectAnimator
                    .ofFloat(expandedImageView, View.X, startBounds.left))
                    .with(ObjectAnimator
                            .ofFloat(expandedImageView,
                                    View.Y,startBounds.top))
                    .with(ObjectAnimator
                            .ofFloat(expandedImageView,
                                    View.SCALE_X, startScaleFinal))
                    .with(ObjectAnimator
                            .ofFloat(expandedImageView,
                                    View.SCALE_Y, startScaleFinal));
            set.setDuration(mShortAnimationDuration);
            set.setInterpolator(new DecelerateInterpolator());
            set.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    thumbView.setAlpha(1f);
                    expandedImageView.setVisibility(View.GONE);
                    mCurrentAnimator = null;
                }

                @Override
                public void onAnimationCancel(Animator animation) {
                    thumbView.setAlpha(1f);
                    expandedImageView.setVisibility(View.GONE);
                    mCurrentAnimator = null;
                }
            });
            set.start();
            mCurrentAnimator = set;
        }
    });
}

目前我正在制作动画,我在 imageview 上有一个图像,如果我点击它,它会被缩小(填充屏幕),然后它会被放大。

我使用 this function 创建动画。但我也有imageview的背景(可绘制文件夹),我希望它在缩小和缩小时增加(和减少)它的不透明度。我知道我必须使用setAlpha(),但我不知道把它放在哪里。请帮忙...

【问题讨论】:

  • 我能知道您要设置的不透明度值吗?1. 放大,2. 缩小??
  • 我认为它在 0.0 和 1.0 之间,所以在从 0.0 缩小到 1.0 时,反之亦然
  • 苏拉蒂岩石...@jankigadhiya
  • 是的,我只想更改背景不透明度而不是图像本身。

标签: android android-animation opacity


【解决方案1】:

您需要创建两个背景可绘制对象,一个具有完全不透明度,另一个具有 0 不透明度,然后您可以使用此代码从一个可绘制对象动画到另一个。

我创建了一个 drawable 数组,其中包含两个可绘制对象。

Drawable[] drawables = {ContextCompat.getDrawable(mActivity, R.drawable.firstBackgroundDrawable),ContextCompat.getDrawable(mActivity, R.drawable.secndBackgroundDrawable)};
TransitionDrawable trans = new TransitionDrawable(drawables);
imageID.setBackground(trans); 
trans.setCrossFadeEnabled(true);
trans.startTransition(5000);

startTransition(duration)你可以设置动画持续时间。

【讨论】:

  • 感谢您的回答,但我认为它会改变图像的 alpha 级别而不是背景
  • 对不起,你能解释一下你的代码是如何工作的吗,因为我认为它更接近答案。唯一的区别是我想更改背景(可绘制文件夹)alpha,我认为我应该使用它
  • ObjectAnimator.ofFloat(targetView ,propertyName , fromValue,toValue) 属性名称可以是 alpharotation ,fromValue 和 to Value 可以自己理解。
  • 我使用了objectanimator.ofFloat(background_drawable, "alpha", 0f, 1f),但它不起作用。请帮忙
  • targetView 是您要设置动画的视图。
【解决方案2】:

your_image_name.animate().setDuration(300).alpha(0f);

your_image_name=ImageView,可以是任何东西! (文本/按钮/布局)

alpha(0f) = f 表示浮点数(0 = 0%, 1 = 100%)

alpha(0.5f) = 50% alpha

如果您想在放大/缩小的同时更改 alpha,请在开始缩放动画时进行!

【讨论】:

  • 谢谢,但我认为它改变了图像的 alpha 级别而不是图像的背景。我需要在图像缩小和缩小时更改背景 Alpha 级别
【解决方案3】:

如果它被绘制为位图,你可以这样做:

Paint alphaPaint = new Paint();
alphaPaint.setAlpha(ALPHA);
canvas.drawBitmap(bitmap, x, y, alphaPaint);

为了控制由你决定的Alpha

编辑:

根据你告诉我的:

Paint alphaPaint = new Paint();
alphaPaint.setAlpha(ALPHA);
alphaPaint.setColor(Color.BLACK);
canvas.drawRect(rect, alphaPaint);

【讨论】:

  • 谢谢,但我怕你误会了,因为我想改变背景不透明度而不是图像的
  • 背景是什么?
  • 只有一个黑色来隐藏屏幕的其他部分,除了展开的图像,首先它应该是透明的,点击图像后,alpha级别应该依次增加,直到图像全屏。然后整个背景(除了图像)将是黑色的(我认为像电报)
  • 更新了答案
  • 对不起,你为什么要画矩形
猜你喜欢
  • 2021-03-26
  • 2012-12-01
  • 2018-08-24
  • 2012-06-16
  • 1970-01-01
  • 2021-03-24
  • 2012-09-20
  • 1970-01-01
  • 2011-10-24
相关资源
最近更新 更多