From aa27d1c3cb9fae9be142aa9d821345263f3026c8 Mon Sep 17 00:00:00 2001 From: Floens Date: Fri, 26 Jul 2019 17:36:51 +0200 Subject: [PATCH] captchanojs2: set up view for each getView call it's for when a view is given that you should recycle, it sets up the view every time. use viewpropertyanimator for animating the image and checkmark. --- .../ui/captcha/v2/CaptchaNoJsV2Adapter.java | 54 +++++++++++-------- .../org/floens/chan/utils/AndroidUtils.java | 36 ------------- .../layout/layout_captcha_challenge_image.xml | 7 +-- 3 files changed, 36 insertions(+), 61 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/ui/captcha/v2/CaptchaNoJsV2Adapter.java b/Clover/app/src/main/java/org/floens/chan/ui/captcha/v2/CaptchaNoJsV2Adapter.java index 51a1780b..74a1f9b4 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/captcha/v2/CaptchaNoJsV2Adapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/captcha/v2/CaptchaNoJsV2Adapter.java @@ -8,17 +8,15 @@ import android.view.HapticFeedbackConstants; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.animation.DecelerateInterpolator; import android.widget.BaseAdapter; import org.floens.chan.R; -import org.floens.chan.utils.AndroidUtils; import java.util.ArrayList; import java.util.List; public class CaptchaNoJsV2Adapter extends BaseAdapter { - private static final int ANIMATION_DURATION = 50; - private LayoutInflater inflater; private int imageSize = 0; @@ -57,26 +55,38 @@ public class CaptchaNoJsV2Adapter extends BaseAdapter { public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.layout_captcha_challenge_image, parent, false); + } - AppCompatImageView imageView = convertView.findViewById(R.id.captcha_challenge_image); - ConstraintLayout blueCheckmarkHolder = convertView.findViewById(R.id.captcha_challenge_blue_checkmark_holder); - - ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(imageSize, imageSize); - imageView.setLayoutParams(layoutParams); - - imageView.setOnClickListener((view) -> { - view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); - - imageList.get(position).toggleChecked(); - boolean isChecked = imageList.get(position).isChecked; - - AndroidUtils.animateViewScale(imageView, isChecked, ANIMATION_DURATION); - blueCheckmarkHolder.setVisibility(isChecked ? View.VISIBLE : View.GONE); - }); - - if (position >= 0 && position <= imageList.size()) { - imageView.setImageBitmap(imageList.get(position).getBitmap()); - } + AppCompatImageView imageView = convertView.findViewById(R.id.captcha_challenge_image); + imageView.setScaleX(1.0f); + imageView.setScaleY(1.0f); + ConstraintLayout blueCheckmarkHolder = convertView.findViewById(R.id.captcha_challenge_blue_checkmark_holder); + blueCheckmarkHolder.setAlpha(0.0f); + + ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(imageSize, imageSize); + imageView.setLayoutParams(layoutParams); + + imageView.setOnClickListener((view) -> { + view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); + + imageList.get(position).toggleChecked(); + boolean isChecked = imageList.get(position).isChecked; + + imageView.animate() + .scaleX(isChecked ? 0.8f : 1.0f) + .scaleY(isChecked ? 0.8f : 1.0f) + .setInterpolator(new DecelerateInterpolator(2.0f)) + .setDuration(200) + .start(); + blueCheckmarkHolder.animate() + .alpha(isChecked ? 1.0f : 0.0f) + .setInterpolator(new DecelerateInterpolator(2.0f)) + .setDuration(200) + .start(); + }); + + if (position >= 0 && position <= imageList.size()) { + imageView.setImageBitmap(imageList.get(position).getBitmap()); } return convertView; diff --git a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java index d4e950a0..cc8aa1f3 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java @@ -51,8 +51,6 @@ import android.view.ViewTreeObserver; import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import android.widget.Toast; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.view.animation.ScaleAnimation; import org.floens.chan.R; @@ -460,40 +458,6 @@ public class AndroidUtils { return networkInfo != null && networkInfo.isConnected(); } - public static void animateViewScale(View view, boolean zoomOut, int duration) { - ScaleAnimation scaleAnimation; - final float normalScale = 1.0f; - final float zoomOutScale = 0.8f; - - if (zoomOut) { - scaleAnimation = new ScaleAnimation( - normalScale, - zoomOutScale, - normalScale, - zoomOutScale, - ScaleAnimation.RELATIVE_TO_SELF, - 0.5f, - ScaleAnimation.RELATIVE_TO_SELF, - 0.5f); - } else { - scaleAnimation = new ScaleAnimation( - zoomOutScale, - normalScale, - zoomOutScale, - normalScale, - ScaleAnimation.RELATIVE_TO_SELF, - 0.5f, - ScaleAnimation.RELATIVE_TO_SELF, - 0.5f); - } - - scaleAnimation.setDuration(duration); - scaleAnimation.setFillAfter(true); - scaleAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); - - view.startAnimation(scaleAnimation); - } - public static boolean enableHighEndAnimations() { boolean lowRamDevice = ActivityManagerCompat.isLowRamDevice(activityManager); return !lowRamDevice && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; diff --git a/Clover/app/src/main/res/layout/layout_captcha_challenge_image.xml b/Clover/app/src/main/res/layout/layout_captcha_challenge_image.xml index 22da5cb4..760bfb3d 100644 --- a/Clover/app/src/main/res/layout/layout_captcha_challenge_image.xml +++ b/Clover/app/src/main/res/layout/layout_captcha_challenge_image.xml @@ -2,7 +2,8 @@ + android:layout_height="match_parent" + android:padding="1dp"> + app:layout_constraintTop_toTopOf="parent">