gpt4 book ai didi

Android ImageView变形: from Square to Circle (Solution updated)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:30:01 25 4
gpt4 key购买 nike

我正在使用 CircularReveal 创建动画,将方形专辑封面变成圆形。以下是一个简短的 fragment 。

int cx = mImageView.getMeasuredWidth() / 2;
int cy = mImageView.getMeasuredHeight() / 2;

// get the initial radius for the clipping circle
int initialRadius = mImageView.getWidth() / 2;

// create the animation (the final radius is zero)
Animator anim = ViewAnimationUtils.createCircularReveal(mImageView, cx, cy, mImageView.getWidth(), initialRadius);
anim.setDuration(500);
anim.start();

问题是,在动画之后,图像不会保持圆形。我一直在寻找类似 Animation.fillAfter(boolean fillAfter) 调用的东西,但动画师没有那个选项。

以下是当前(故障)行为。

enter image description here

有什么建议可以在动画后将图像固定为圆圈吗?

最佳答案

我通过使用 GradientDrawable 和我的自定义 CardView 将此 CircularRevealView 完全替换为自定义 mask 来解决此问题。

我的 xml (tmp_activity.xml)

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/background_button"
tools:context=".TempActivity_">

<com.myapp.customviews.AnimatableCardView
android:id="@+id/base_view"
android:layout_marginLeft="@dimen/margin_medium"
android:layout_centerVertical="true"
android:layout_width="@dimen/album_art_small"
android:layout_height="@dimen/album_art_small"
app:cardElevation="0dp">

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:src="@drawable/charlie"
android:id="@+id/imageView2"/>

</com.myapp.customviews.AnimatableCardView>
</RelativeLayout>

我的 Activity (请注意,我使用的是 Android Annotations,而不是 findViewById(..))

@EActivity(R.layout.tmp_activity)
public class TempActivity extends BaseActivity {
@ViewById(R.id.base_view)
ViewGroup mParent;

@ViewById(R.id.imageView2)
ImageView mImageView;

GradientDrawable gradientDrawable;

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

private volatile boolean isCircle = false;
@Override
protected void onViewsCreated() {
super.onViewsCreated();

gradientDrawable = new GradientDrawable();
gradientDrawable.setCornerRadius(30.0f);
gradientDrawable.setShape(GradientDrawable.RECTANGLE);
mParent.setBackground(gradientDrawable);

mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
if (isCircle) {
makeSquare();
}
else {
makeCircle();
}
isCircle = !isCircle;
}
});
}

private void makeCircle() {
ObjectAnimator cornerAnimation =
ObjectAnimator.ofFloat(gradientDrawable, "cornerRadius", 30f, 200.0f);

Animator shiftAnimation = AnimatorInflater.loadAnimator(this, R.animator.slide_right_down);
shiftAnimation.setTarget(mParent);

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(500);
animatorSet.playTogether(cornerAnimation, shiftAnimation);
animatorSet.start();
}

private void makeSquare() {
ObjectAnimator cornerAnimation =
ObjectAnimator.ofFloat(gradientDrawable, "cornerRadius", 200.0f, 30f);

Animator shiftAnimation = AnimatorInflater.loadAnimator(this, R.animator.slide_left_up);
shiftAnimation.setTarget(mParent);

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(500);
animatorSet.playTogether(cornerAnimation, shiftAnimation);
animatorSet.start();
}
}

我的自定义CardView(AnimatableCardView)

public class AnimatableCardView extends CardView {
private float xFraction = 0;
private float yFraction = 0;

private ViewTreeObserver.OnPreDrawListener preDrawListener = null;

public AnimatableCardView(Context context) {
super(context);
}

public AnimatableCardView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public AnimatableCardView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

// Note that fraction "0.0" is the starting point of the view. This includes margins.
// If this view was placed in (200,300), moveTo="0.1" for xFraction will give you (220,300)
public void setXFraction(float fraction) {
this.xFraction = fraction;

if (((ViewGroup) getParent()).getWidth() == 0) {
if (preDrawListener == null) {
preDrawListener = new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
getViewTreeObserver().removeOnPreDrawListener(preDrawListener);
setXFraction(xFraction);
return true;
}
};
getViewTreeObserver().addOnPreDrawListener(preDrawListener);
}
return;
}

float translationX = Math.max(0, (((ViewGroup) getParent()).getWidth()) * fraction - (getWidth() * getScaleX() / 2));
setTranslationX(translationX);
}

public float getXFraction() {
return this.xFraction;
}

public void setYFraction(float fraction) {
this.yFraction = fraction;

if (((ViewGroup) getParent()).getHeight() == 0) {
if (preDrawListener == null) {
preDrawListener = new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
getViewTreeObserver().removeOnPreDrawListener(preDrawListener);
setYFraction(yFraction);
return true;
}
};
getViewTreeObserver().addOnPreDrawListener(preDrawListener);
}
return;
}

float translationY = Math.max(0, (((ViewGroup) getParent()).getHeight()) * fraction - (getHeight() * getScaleY() / 2));
setTranslationY(translationY);
}

public float getYFraction() {
return this.yFraction;
}
}

slide_right_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="xFraction"
android:duration="@android:integer/config_mediumAnimTime"
android:valueFrom="0.0"
android:valueTo="0.5"
android:valueType="floatType"/>

<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="yFraction"
android:duration="@android:integer/config_mediumAnimTime"
android:valueFrom="0.0"
android:valueTo="0.1"
android:valueType="floatType"/>

<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:propertyName="scaleX"
android:valueFrom="1.0"
android:valueTo="1.5"/>

<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:propertyName="scaleY"
android:valueFrom="1.0"
android:valueTo="1.5"/>
</set>

slide_left_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set android:ordering="together"
xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:propertyName="xFraction"
android:duration="@android:integer/config_mediumAnimTime"
android:valueFrom="0.5"
android:valueTo="0.0"
android:valueType="floatType"/>
<objectAnimator
android:propertyName="yFraction"
android:duration="@android:integer/config_mediumAnimTime"
android:valueFrom="0.1"
android:valueTo="0.0"
android:valueType="floatType"/>

<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:propertyName="scaleX"
android:valueFrom="1.5"
android:valueTo="1.0"/>

<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:propertyName="scaleY"
android:valueFrom="1.5"
android:valueTo="1.0"/>
</set>

这是结果(从设备上看更快更流畅)

enter image description here

关于Android ImageView变形: from Square to Circle (Solution updated),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39840304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com