hitherejoe / animate

An application demoing meaningful motion on Android
https://medium.com/ribot-labs/exploring-meaningful-motion-on-android-1cd95a4bc61d
3.11k stars 474 forks source link

Code refactoring in PopupActivity.java #8

Open vicbguti-espol opened 11 months ago

vicbguti-espol commented 11 months ago

Hi there, I was reviewing the code, it's awesome. I think it would be better if some parts are changed for better readability and future extensions. They are mentioned below.

I've seen two very big methods, setupSharedElementTransitionsFab() and setupSharedElementTransitionsButton(). And I think these ones would be refactored into creating a new abstract class with some common methods, with a new interface for setting up transitions. I think it would be better explained in the UML class diagram presented below.

image

And I also share the code snippets proposals I had reffered to,

app/src/main/java/com/hitherejoe/animate/ui/activity/SharedElementTransition.java

package com.hitherejoe.animate.ui.activity;

public abstract class SharedElementTransition implements ShareableElementTransition{
    protected ArcMotion arcMotion;
    protected Interpolator easeInOut;
    protected int color;
    protected ChangeBounds sharedEnter;
    protected ChangeBounds sharedReturn;

    public SharedElementTransition() {
        setUpArcMotion();
        setUpInterpolator();
        setUpColor();
    }

    void setUpArcMotion(){
        arcMotion = new ArcMotion();
        arcMotion.setMinimumHorizontalAngle(50f);
        arcMotion.setMinimumVerticalAngle(50f);
    }

    void setUpInterpolator() {
        easeInOut =
                AnimationUtils.loadInterpolator(activity, android.R.interpolator.fast_out_slow_in);
    }

    void setUpColor() {
        color = ContextCompat.getColor(activity, R.color.accent);
    }

    @Override
    public void setupSharedElementTransitions(Activity activity, View target) {
        setUpMorphToDialog();
        setUpMorphFromDialog();
        if (target != null) {
            sharedEnter.addTarget(target);
            sharedReturn.addTarget(target);
        }
        activity.getWindow().setSharedElementEnterTransition(sharedEnter);
        activity.getWindow().setSharedElementReturnTransition(sharedReturn);
    }

    abstract void setUpMorphToDialog();
    abstract void setUpMorphFromDialog();
}

app/src/main/java/com/hitherejoe/animate/ui/activity/ShareableElementTransition.java

package com.hitherejoe.animate.ui.activity;

public interface ShareableElementTransition {
    void setupSharedElementTransitions(Activity activity, View target);
}

app/src/main/java/com/hitherejoe/animate/ui/activity/ButtonSharedElementTransition.java

package com.hitherejoe.animate.ui.activity;

import com.hitherejoe.animate.util.MorphButtonToDialog;
import com.hitherejoe.animate.util.MorphDialogToButton;

public class ButtonSharedElementTransition 
        extends SharedElementTransition {

    @Override
    void setUpMorphToDialog() {
        super.sharedEnter = new MorphButtonToDialog(super.color);
        super.sharedEnter.setPathMotion(arcMotion);
        super.sharedEnter.setInterpolator(easeInOut);
    }

    @Override
    void setUpMorphFromDialog() {
        super.sharedReturn = new MorphDialogToButton(color);
        super.sharedReturn.setPathMotion(arcMotion);
        super.sharedReturn.setInterpolator(easeInOut);
    }
}

app/src/main/java/com/hitherejoe/animate/ui/activity/FabSharedElementTransition.java

package com.hitherejoe.animate.ui.activity;

import com.hitherejoe.animate.util.MorphDialogToFab;
import com.hitherejoe.animate.util.MorphFabToDialog;

public class FabSharedElementTransition 
        extends SharedElementTransition {

    private int dialogCornerRadius;

    public FabSharedElementTransition(int dialogCornerRadius) {
        this.dialogCornerRadius = dialogCornerRadius;
    }

    @Override
    void setUpMorphToDialog() {
        sharedEnter = new MorphFabToDialog(color, dialogCornerRadius);
        sharedEnter.setPathMotion(arcMotion);
        sharedEnter.setInterpolator(easeInOut);
    }

    @Override
    void setUpMorphFromDialog() {
        sharedReturn = new MorphDialogToFab(color);
        sharedReturn.setPathMotion(arcMotion);
        sharedReturn.setInterpolator(easeInOut);
    }

}

app/src/main/java/com/hitherejoe/animate/ui/activity/PopupActivity.java

package com.hitherejoe.animate.ui.activity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;

public class PopupActivity extends Activity {

    boolean isDismissing = false;

    public static final String EXTRA_MORPH_TYPE = "morph_type";
    public static final String MORPH_TYPE_BUTTON = "morph_type_button";
    public static final String MORPH_TYPE_FAB = "morph_type_fab";

    public static Intent getStartIntent(Context context, String type) {
        Intent intent = new Intent(context, PopupActivity.class);
        intent.putExtra(EXTRA_MORPH_TYPE, type);
        return intent;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_popup);

        String type = getIntent().getStringExtra(EXTRA_MORPH_TYPE);
        ShareableElementTransition transition = createTransitionForType(type);
        if (transition != null) {
            View container = (ViewGroup) findViewById(R.id.container);
            transition.setupSharedElementTransitions(this, container);       
        }
    }

    private ShareableElementTransition createTransitionForType(String type) {
        if (type.equals(MORPH_TYPE_BUTTON)) {
            return new ButtonSharedElementTransition();
        } else if (type.equals(MORPH_TYPE_FAB)) {
            return new FabSharedElementTransition( 
    getResources().getDimensionPixelSize(R.dimen.dialog_corners));
        }
        return null; 
}

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
    }

    public void dismiss(View view) {
        isDismissing = true;
        setResult(Activity.RESULT_CANCELED);
        finishAfterTransition();
    }

    @Override
    public void onBackPressed() {
        dismiss(null);
    }

}

Note: At this moment, I did not considered to make a pull request for android dependecies I hadn't put enough effort to link with the code, but even with that I had written based on the code project. Have a nice day!

GWS520 commented 11 months ago

谢谢亲,你的发送的邮件我已经收到了!Thanks