From e7b33bba0b08ef1747bc0abe11f148ae6f5a57b7 Mon Sep 17 00:00:00 2001 From: HuyDuc Date: Wed, 1 Jun 2016 14:28:11 +0700 Subject: [PATCH 1/2] Refactor: use ternary in simple cases, split values into constants, declare local variables to reduce frequent method calls --- .../java/com/meetic/marypopup/MaryPopup.java | 270 ++++++++---------- 1 file changed, 125 insertions(+), 145 deletions(-) diff --git a/marypopup/src/main/java/com/meetic/marypopup/MaryPopup.java b/marypopup/src/main/java/com/meetic/marypopup/MaryPopup.java index b426c68..e1e5ddc 100644 --- a/marypopup/src/main/java/com/meetic/marypopup/MaryPopup.java +++ b/marypopup/src/main/java/com/meetic/marypopup/MaryPopup.java @@ -23,6 +23,13 @@ */ public class MaryPopup implements View.OnClickListener { + public static final float DRAGGABLE_VIEW_MAX_DRAG_PERCENTAGE_Y = 0.35f; + public static final String BLACK_OVERLAY_COLOR = "#CC333333"; + public static final float SCALE_DOWN_DRAGGING_MAX_PERCENTAGE = 0.75f; + public static final float DURX_PIVOT_X_PERCENTAGE = 0.5f; + public static final int OPEN_DURATION_DELAY_OFFSET = 100; + public static final int POPUP_VIEW_BASE_ELEVATION = 6; + final Activity activity; final ViewGroup activityView; final View actionBarView; @@ -31,7 +38,7 @@ public class MaryPopup implements View.OnClickListener { @Nullable View blackOverlay; - int blackOverlayColor = Color.parseColor("#CC333333"); + int blackOverlayColor = Color.parseColor(BLACK_OVERLAY_COLOR); @Nullable ViewGroup popupView; @@ -163,80 +170,71 @@ public MaryPopup scaleDownCloseOnClick(boolean scaleDownCloseOnClick) { public void show() { if (blackOverlay == null) { - { - handleClick = false; - blackOverlay = new View(activity); - blackOverlay.setBackgroundColor(blackOverlayColor); - activityView.addView(blackOverlay, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - DurX.putOn(blackOverlay) + handleClick = false; + blackOverlay = new View(activity); + blackOverlay.setBackgroundColor(blackOverlayColor); + activityView.addView(blackOverlay, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + DurX.putOn(blackOverlay) .animate() .alpha(0f, 1f); - blackOverlay.setOnClickListener(this); - } - { - if (draggable) { - popupView = (ViewGroup) LayoutInflater.from(activity).inflate(R.layout.popup_layout_draggable, activityView, false); - } else { - popupView = (ViewGroup) LayoutInflater.from(activity).inflate(R.layout.popup_layout, activityView, false); - } - if (popupView != null) { - if (width >= 0) { - ViewGroup.LayoutParams layoutParams = popupView.getLayoutParams(); - layoutParams.width = width; - popupView.setLayoutParams(layoutParams); - } - if (height >= 0) { - ViewGroup.LayoutParams layoutParams = popupView.getLayoutParams(); - layoutParams.height = height; - popupView.setLayoutParams(layoutParams); - } + blackOverlay.setOnClickListener(this); + + popupView = (ViewGroup) LayoutInflater.from(activity).inflate( + draggable ? R.layout.popup_layout_draggable : R.layout.popup_layout, + activityView, false); + + if (popupView != null) { + ViewGroup.LayoutParams layoutParams = popupView.getLayoutParams(); + if (width >= 0) layoutParams.width = width; + if (height >= 0) layoutParams.height = height; + popupView.setLayoutParams(layoutParams); - if(popupView instanceof DraggableView) { - DraggableView draggableView = (DraggableView) popupView; + if (popupView instanceof DraggableView) { + DraggableView draggableView = (DraggableView) popupView; - draggableView.setDraggable(false); - draggableView.setInlineMove(inlineMove); - draggableView.setVertical(true); - draggableView.setListenVelocity(false); - draggableView.setMaxDragPercentageY(0.35f); + draggableView.setDraggable(false); + draggableView.setInlineMove(inlineMove); + draggableView.setVertical(true); + draggableView.setListenVelocity(false); + draggableView.setMaxDragPercentageY(DRAGGABLE_VIEW_MAX_DRAG_PERCENTAGE_Y); - if (scaleDownCloseOnDrag) { - draggableView.setViewAnimator(new ReturnOriginViewAnimator() { + draggableView.setViewAnimator(scaleDownCloseOnDrag ? + new ReturnOriginViewAnimator() { @Override - public boolean animateExit(@NonNull DraggableView draggableView, Direction direction, int duration) { + public boolean animateExit(@NonNull DraggableView draggableView, + Direction direction, int duration) { close(true); return true; } - }); - } else { - draggableView.setViewAnimator(new ExitViewAnimator() { - }); - } - draggableView.setDragListener(new DraggableViewListener(this)); + } : + new ExitViewAnimator() { + } + ); + draggableView.setDragListener(new DraggableViewListener(this)); + } + popupView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } - popupView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - } - }); - popupViewContent = (ViewGroup) popupView.findViewById(R.id.content); - if (!shadow) { - popupView.setBackgroundColor(popupBackgroundColor); - } else { - if (popupBackgroundColor != null && popupViewContent != null) { - popupViewContent.setBackgroundColor(popupBackgroundColor); - } - ViewCompat.setElevation(popupView, 6); + }); + popupViewContent = (ViewGroup) popupView.findViewById(R.id.content); + if (!shadow) { + popupView.setBackgroundColor(popupBackgroundColor); + } else { + if (popupBackgroundColor != null && popupViewContent != null) { + popupViewContent.setBackgroundColor(popupBackgroundColor); } - if (contentLayout != null && popupViewContent != null) { - if (contentLayout.getParent() != null) { - ((ViewGroup) contentLayout.getParent()).removeView(contentLayout); - } - popupViewContent.addView(contentLayout); + ViewCompat.setElevation(popupView, POPUP_VIEW_BASE_ELEVATION); + } + if (contentLayout != null && popupViewContent != null) { + if (contentLayout.getParent() != null) { + ((ViewGroup) contentLayout.getParent()).removeView(contentLayout); } + popupViewContent.addView(contentLayout); + } - DurX.putOn(popupView) + DurX.putOn(popupView) .pivotX(0f) .pivotY(0f) .invisible() @@ -244,22 +242,27 @@ public void onClick(View v) { @Override public void onSize(DurX durX) { if (viewOrigin != null) { - differenceScaleX = viewOrigin.getWidth() * 1.0f / popupView.getWidth(); + int popupViewWidth = popupView.getWidth(); + + float viewOriginX = getX(viewOrigin); + float viewOriginY = getY(viewOrigin); + + differenceScaleX = viewOrigin.getWidth() * 1.0f / popupViewWidth; differenceScaleY = viewOrigin.getHeight() * 1.0f / popupView.getHeight(); float translationX; float translationY; if (center) { - differenceTranslationX = getX(viewOrigin); - differenceTranslationY = getY(viewOrigin); - translationX = activityView.getWidth() / 2 - popupView.getWidth() / 2; + differenceTranslationX = viewOriginX; + differenceTranslationY = viewOriginY; + translationX = activityView.getWidth() / 2 - popupViewWidth / 2; translationY = activityView.getHeight() / 2 - popupView.getHeight() / 2; } else { - differenceTranslationX = getX(viewOrigin) - getX(popupView); - differenceTranslationY = getY(viewOrigin) - getY(popupView); - translationX = getX(viewOrigin) - (popupView.getWidth() - viewOrigin.getWidth()) / 2f; - translationY = getY(viewOrigin) - getStatusBarHeight(); + differenceTranslationX = viewOriginX - getX(popupView); + differenceTranslationY = viewOriginY - getY(popupView); + translationX = viewOriginX - (popupViewWidth - viewOrigin.getWidth()) / 2f; + translationY = viewOriginY - getStatusBarHeight(); } DurX.putOn(popupView) @@ -290,13 +293,12 @@ public void onEnd() { .andPutOn(popupViewContent) .visible() .animate() - .startDelay(openDuration - 100) + .startDelay(openDuration - OPEN_DURATION_DELAY_OFFSET) .alpha(0f, 1f); } } }); activityView.addView(popupView); - } } } } @@ -327,69 +329,51 @@ public void onEnd() { isAnimating = true; if (withScaleDown) { + if (popupView != null) { + float scaleX = viewOrigin.getWidth() * 1.0f / (popupView.getWidth() * ViewCompat.getScaleX(popupView)); + float scaleY = viewOrigin.getHeight() * 1.0f / (popupView.getHeight() * ViewCompat.getScaleY(popupView)); - float scaleX = viewOrigin.getWidth() * 1.0f / (popupView.getWidth() * ViewCompat.getScaleX(popupView)); - float scaleY = viewOrigin.getHeight() * 1.0f / (popupView.getHeight() * ViewCompat.getScaleY(popupView)); - - float translationX; - float translationY; - - if (center) { - translationX = 0; - translationY = 0; - } else { - translationX = ViewCompat.getTranslationX(popupView); - translationY = ViewCompat.getTranslationY(popupView) - getStatusBarHeight(); - } + float translationX = ViewCompat.getTranslationX(popupView); + float translationY = ViewCompat.getTranslationY(popupView) - getStatusBarHeight(); - float xViewOrigin = getX(viewOrigin); - float yViewOrigin = getY(viewOrigin); + float xViewOrigin = getX(viewOrigin); + float yViewOrigin = getY(viewOrigin); - float xPopupView = getX(popupView); - float yPopupView = getY(popupView) - getStatusBarHeight(); + float xPopupView = getX(popupView); + float yPopupView = getY(popupView) - getStatusBarHeight(); - float tx = 0; - if (xViewOrigin < xPopupView) { - tx = xPopupView - xViewOrigin; - } else { // xViewOrigin > xPopupView - tx = xViewOrigin - xPopupView; - } + float tx = Math.abs(xPopupView - xViewOrigin); + float ty = Math.abs(yPopupView - yViewOrigin); - if (center) { - tx *= (1f - scaleX); - } - translationX += tx; + if (center) { + translationX = 0; + translationY = 0; - float ty = 0; - if (yViewOrigin < yPopupView) { - ty = yPopupView - yViewOrigin; - } else { // yViewOrigin > yPopupView - ty = yViewOrigin - yPopupView; - } + tx *= (1f - scaleX); + ty *= (1f - scaleY); + } - if (center) { - ty *= (1f - scaleY); + translationX += tx; + translationY += ty; + + DurX.putOn(popupViewContent) + .animate() + .alpha(0f) + .duration(closeDuration) + + .andAnimate(popupView) + .scaleX(scaleX) + .scaleY(scaleY) + .alpha(0f) + .translationX(translationX) + .translationY(translationY) + .duration(closeDuration) + + .andAnimate(blackOverlay) + .alpha(0f) + .duration(closeDuration) + .end(clearListener); } - translationY += ty; - - DurX.putOn(popupViewContent) - .animate() - .alpha(0f) - .duration(closeDuration) - - .andAnimate(popupView) - .scaleX(scaleX) - .scaleY(scaleY) - .alpha(0f) - .translationX(translationX) - .translationY(translationY) - .duration(closeDuration) - - .andAnimate(blackOverlay) - .alpha(0f) - .duration(closeDuration) - .end(clearListener) - ; } else { DurX.putOn(blackOverlay) .animate() @@ -424,23 +408,20 @@ public float getStatusBarHeight() { } float getY(View view) { - Rect rect = new Rect(); - view.getGlobalVisibleRect(rect); - float y = rect.top; - if (y <= 0) { - y = ViewCompat.getY(view); - } - return y; + return getLocation(view, false); } float getX(View view) { + return getLocation(view, true); + } + + private float getLocation(View view, boolean getX) { Rect rect = new Rect(); view.getGlobalVisibleRect(rect); - float x = rect.left; - if (x <= 0) { - x = ViewCompat.getX(view); - } - return x; + + return getX ? + (rect.left > 0 ? rect.left : ViewCompat.getX(view)) : + (rect.top > 0 ? rect.top : ViewCompat.getY(view)); } static class DraggableViewListener extends DraggableView.DraggableViewListenerAdapter { @@ -459,16 +440,15 @@ public void onDrag(DraggableView draggableView, float percentX, float percentY) if (popup != null && !popup.isAnimating) { float percent = 1f - Math.abs(percentY); + DurX durX = DurX.putOn(popup.popupView); + if (popup.fadeOutDragging) { - DurX.putOn(popup.popupView) - .alpha(percent); + durX.alpha(percent); } if (popup.scaleDownDragging) { - float scale = Math.max(0.75f, percent); - DurX.putOn(popup.popupView) - .pivotX(0.5f) - .scale(scale); + float scale = Math.max(SCALE_DOWN_DRAGGING_MAX_PERCENTAGE, percent); + durX.pivotX(DURX_PIVOT_X_PERCENTAGE).scale(scale); } } } From 7a0c2eee7ef2f1b46ebe7b473e9923387782f901 Mon Sep 17 00:00:00 2001 From: HuyDuc Date: Wed, 1 Jun 2016 14:57:40 +0700 Subject: [PATCH 2/2] Refactor: Make PopupActivity be extended by the others --- .../marypopup/sample/PopupActivity.java | 24 ++++++---- .../marypopup/sample/PopupCenterActivity.java | 46 +++---------------- .../sample/PopupDraggableActivity.java | 42 ++--------------- .../sample/PopupFadeOutDraggableActivity.java | 42 ++--------------- .../sample/PopupNotDraggableActivity.java | 40 ++-------------- .../PopupScaleDownDraggableActivity.java | 42 ++--------------- 6 files changed, 38 insertions(+), 198 deletions(-) diff --git a/app/src/main/java/com/meetic/marypopup/sample/PopupActivity.java b/app/src/main/java/com/meetic/marypopup/sample/PopupActivity.java index f01a08c..3f9f3ee 100644 --- a/app/src/main/java/com/meetic/marypopup/sample/PopupActivity.java +++ b/app/src/main/java/com/meetic/marypopup/sample/PopupActivity.java @@ -20,15 +20,23 @@ public class PopupActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setUpPopup(); + } + + protected void setUpPopup() { setContentView(R.layout.activity_popup); ButterKnife.bind(this); - popup = MaryPopup.with(this) - .cancellable(true) - .draggable(true) - .scaleDownDragging(true) - .fadeOutDragging(true) - .blackOverlayColor(Color.parseColor("#DD444444")) - .backgroundColor(Color.parseColor("#EFF4F5")); + popup = createMaryPopup() + .draggable(true) + .scaleDownDragging(true) + .fadeOutDragging(true); + } + + protected MaryPopup createMaryPopup() { + return MaryPopup.with(this) + .cancellable(true) + .blackOverlayColor(Color.parseColor("#DD444444")) + .backgroundColor(Color.parseColor("#EFF4F5")); } @OnClick(R.id.cardView) @@ -41,7 +49,7 @@ public void onClickCardView() { @Override public void onBackPressed() { - if(popup.isOpened()){ + if (popup.isOpened()){ popup.close(true); } else { super.onBackPressed(); diff --git a/app/src/main/java/com/meetic/marypopup/sample/PopupCenterActivity.java b/app/src/main/java/com/meetic/marypopup/sample/PopupCenterActivity.java index dbb1414..5f1a820 100644 --- a/app/src/main/java/com/meetic/marypopup/sample/PopupCenterActivity.java +++ b/app/src/main/java/com/meetic/marypopup/sample/PopupCenterActivity.java @@ -1,54 +1,22 @@ package com.meetic.marypopup.sample; -import android.graphics.Color; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; -import android.view.View; - -import com.meetic.marypopup.MaryPopup; - import butterknife.Bind; import butterknife.ButterKnife; -import butterknife.OnClick; -public class PopupCenterActivity extends AppCompatActivity { +public class PopupCenterActivity extends PopupActivity { @Bind(R.id.toolbar) Toolbar toolbar; - @Bind(R.id.cardView) View cardView; - MaryPopup popup; @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + protected void setUpPopup() { setContentView(R.layout.activity_popup_center); ButterKnife.bind(this); setSupportActionBar(toolbar); - popup = MaryPopup.with(this) - .cancellable(true) - .draggable(true) - .scaleDownDragging(true) - .fadeOutDragging(true) - .center(true) - .blackOverlayColor(Color.parseColor("#DD444444")) - .backgroundColor(Color.parseColor("#EFF4F5")); - } - - @OnClick(R.id.cardView) - public void onClickCardView() { - popup - .content(R.layout.popup_content) - .from(cardView) - .show(); - } - - @Override - public void onBackPressed() { - if(popup.isOpened()){ - popup.close(true); - } else { - super.onBackPressed(); - } + popup = createMaryPopup() + .draggable(true) + .scaleDownDragging(true) + .fadeOutDragging(true) + .center(true); } } diff --git a/app/src/main/java/com/meetic/marypopup/sample/PopupDraggableActivity.java b/app/src/main/java/com/meetic/marypopup/sample/PopupDraggableActivity.java index 2245cba..e36bb38 100644 --- a/app/src/main/java/com/meetic/marypopup/sample/PopupDraggableActivity.java +++ b/app/src/main/java/com/meetic/marypopup/sample/PopupDraggableActivity.java @@ -1,48 +1,14 @@ package com.meetic.marypopup.sample; -import android.graphics.Color; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.view.View; - -import com.meetic.marypopup.MaryPopup; - -import butterknife.Bind; import butterknife.ButterKnife; -import butterknife.OnClick; -public class PopupDraggableActivity extends AppCompatActivity { - - @Bind(R.id.cardView) View cardView; - MaryPopup popup; +public class PopupDraggableActivity extends PopupActivity { @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + protected void setUpPopup() { setContentView(R.layout.activity_popup); ButterKnife.bind(this); - popup = MaryPopup.with(this) - .cancellable(true) - .draggable(true) - .blackOverlayColor(Color.parseColor("#DD444444")) - .backgroundColor(Color.parseColor("#EFF4F5")); - } - - @OnClick(R.id.cardView) - public void onClickCardView() { - popup - .content(R.layout.popup_content) - .from(cardView) - .show(); - } - - @Override - public void onBackPressed() { - if(popup.isOpened()){ - popup.close(true); - } else { - super.onBackPressed(); - } + popup = createMaryPopup() + .draggable(true); } } diff --git a/app/src/main/java/com/meetic/marypopup/sample/PopupFadeOutDraggableActivity.java b/app/src/main/java/com/meetic/marypopup/sample/PopupFadeOutDraggableActivity.java index 5a2fd1a..00f88ae 100644 --- a/app/src/main/java/com/meetic/marypopup/sample/PopupFadeOutDraggableActivity.java +++ b/app/src/main/java/com/meetic/marypopup/sample/PopupFadeOutDraggableActivity.java @@ -1,49 +1,15 @@ package com.meetic.marypopup.sample; -import android.graphics.Color; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.view.View; - -import com.meetic.marypopup.MaryPopup; - -import butterknife.Bind; import butterknife.ButterKnife; -import butterknife.OnClick; -public class PopupFadeOutDraggableActivity extends AppCompatActivity { - - @Bind(R.id.cardView) View cardView; - MaryPopup popup; +public class PopupFadeOutDraggableActivity extends PopupActivity { @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + protected void setUpPopup() { setContentView(R.layout.activity_popup); ButterKnife.bind(this); - popup = MaryPopup.with(this) - .cancellable(true) + popup = createMaryPopup() .draggable(true) - .fadeOutDragging(true) - .blackOverlayColor(Color.parseColor("#DD444444")) - .backgroundColor(Color.parseColor("#EFF4F5")); - } - - @OnClick(R.id.cardView) - public void onClickCardView() { - popup - .content(R.layout.popup_content) - .from(cardView) - .show(); - } - - @Override - public void onBackPressed() { - if(popup.isOpened()){ - popup.close(true); - } else { - super.onBackPressed(); - } + .fadeOutDragging(true); } } diff --git a/app/src/main/java/com/meetic/marypopup/sample/PopupNotDraggableActivity.java b/app/src/main/java/com/meetic/marypopup/sample/PopupNotDraggableActivity.java index 58ba8c9..200b80e 100644 --- a/app/src/main/java/com/meetic/marypopup/sample/PopupNotDraggableActivity.java +++ b/app/src/main/java/com/meetic/marypopup/sample/PopupNotDraggableActivity.java @@ -1,47 +1,13 @@ package com.meetic.marypopup.sample; -import android.graphics.Color; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.view.View; - -import com.meetic.marypopup.MaryPopup; - -import butterknife.Bind; import butterknife.ButterKnife; -import butterknife.OnClick; -public class PopupNotDraggableActivity extends AppCompatActivity { - - @Bind(R.id.cardView) View cardView; - MaryPopup popup; +public class PopupNotDraggableActivity extends PopupActivity { @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + protected void setUpPopup() { setContentView(R.layout.activity_popup); ButterKnife.bind(this); - popup = MaryPopup.with(this) - .cancellable(true) - .blackOverlayColor(Color.parseColor("#DD444444")) - .backgroundColor(Color.parseColor("#EFF4F5")); - } - - @OnClick(R.id.cardView) - public void onClickCardView() { - popup - .content(R.layout.popup_content) - .from(cardView) - .show(); - } - - @Override - public void onBackPressed() { - if(popup.isOpened()){ - popup.close(true); - } else { - super.onBackPressed(); - } + popup = createMaryPopup(); } } diff --git a/app/src/main/java/com/meetic/marypopup/sample/PopupScaleDownDraggableActivity.java b/app/src/main/java/com/meetic/marypopup/sample/PopupScaleDownDraggableActivity.java index b3f8e57..917b15d 100644 --- a/app/src/main/java/com/meetic/marypopup/sample/PopupScaleDownDraggableActivity.java +++ b/app/src/main/java/com/meetic/marypopup/sample/PopupScaleDownDraggableActivity.java @@ -1,49 +1,15 @@ package com.meetic.marypopup.sample; -import android.graphics.Color; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.view.View; - -import com.meetic.marypopup.MaryPopup; - -import butterknife.Bind; import butterknife.ButterKnife; -import butterknife.OnClick; -public class PopupScaleDownDraggableActivity extends AppCompatActivity { - - @Bind(R.id.cardView) View cardView; - MaryPopup popup; +public class PopupScaleDownDraggableActivity extends PopupActivity { @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + protected void setUpPopup() { setContentView(R.layout.activity_popup); ButterKnife.bind(this); - popup = MaryPopup.with(this) - .cancellable(true) + popup = createMaryPopup() .draggable(true) - .scaleDownDragging(true) - .blackOverlayColor(Color.parseColor("#DD444444")) - .backgroundColor(Color.parseColor("#EFF4F5")); - } - - @OnClick(R.id.cardView) - public void onClickCardView() { - popup - .content(R.layout.popup_content) - .from(cardView) - .show(); - } - - @Override - public void onBackPressed() { - if(popup.isOpened()){ - popup.close(true); - } else { - super.onBackPressed(); - } + .scaleDownDragging(true); } }