English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحقيق تأثير منعطف للدفع عبر支付宝 باستخدام Android自定义View

هذا المقال يقدم كيفية استخدام View المخصص بجانب تأثيرات التحرك لتحقيق التأثير التالي

المنهجية بسيطة للغاية:

  • رسم دائرة شفافة
  • تحقيق نوعين من تأثيرات التحرك، التوسع عند النقر والتقلص عند عدم النقر
  • استخدام طريقة سريان الوقت لتجمع الخطوتين السابقتين

أولاً دعنا نلقي نظرة على الجزء الذي يرسم الدائرة الشفافة

public class ClickCircleView extends View {
 private Bitmap bitmap;
 private Paint paint;
 private Canvas canvas;
 private boolean isSpreadFlag = false;//标记是否发射完成
 public boolean isSpreadFlag() {
  return isSpreadFlag;
 }
 public void setIsSpreadFlag(boolean isSpreadFlag) {
  this.isSpreadFlag = isSpreadFlag;
 }
 public ClickCircleView(Context context, int width, int height, int screenWidth, int screenHeight) {
  super(context);
  bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888); // 设置位图的宽高
  canvas = new Canvas();
  canvas.setBitmap(bitmap);
  paint = new Paint(Paint.DITHER_FLAG);
  paint.setAntiAlias(true);
  paint.setColor(Color.WHITE);
  paint.setStyle(Paint.Style.FILL);
  paint.setAlpha(50);
  canvas.drawCircle(screenWidth / 2, screenHeight / 2, width / 2 + 10, paint);
  invalidate();
 }
 @Override
 protected void onDraw(Canvas canvas) {
  canvas.drawBitmap(bitmap, 0, 0, null);
 }
}

يمكن رؤية أن جميع الخصائص المحددة في قلم، ثم يتم استدعاء طريقة drawCircle() من لوحة الرسم لرسم دائرة شفافة، وأخيرًا يتم استدعاء طريقة invalidate() لإعادة تحديث View
من الضروري إعادة كتابة طريقة onDraw() في الأصل، وإلا لن تكون الView المخصصةفعالة
لقد قمنا بتعيين علامة معرفية isSpreadFlag، التي تستخدم لتحديد ما إذا كانت حركة التوسع قد اكتملت

ثم سنقوم بإنشاء اثنين من تأثيرات الحركة

عند النقر، تحدث حركة التوسع

<set xmlns:android="http://schemas.android.com/apk/res/android">
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleY"
  android:valueFrom="1.0"
  android:valueTo="1.8"
  android:valueType="floatType" />
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleX"
  android:valueFrom="1.0"
  android:valueTo="1.8"
  android:valueType="floatType" />
</set>

بسيط جداً، فقط تغيير قيمة scale إلى ضعفين

عند عدم النقر، تحدث حركة التوسع والاستعادة

<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:ordering="together">
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleX"
  android:valueFrom="1.0"
  android:valueTo="1.2"
  android:valueType="floatType" />
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleY"
  android:valueFrom="1.0"
  android:valueTo="1.2"
  android:valueType="floatType" />
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleX"
  android:startOffset="1000"
  android:valueFrom="1.2"
  android:valueTo="1.0"
  android:valueType="floatType" />
 <objectAnimator
  android:duration="1000"
  android:propertyName="scaleY"
  android:startOffset="1000"
  android:valueFrom="1.2"
  android:valueTo="1.0"
  android:valueType="floatType" />
</set>

مثل الحركة السابقة، يمكن استخدام معامل التأخير startOffset للتحكم في ترتيب تشغيل Animation، مثل Android:startOffset="1000" يعني إعداد التأخير للحركة 1 ثانية

ثم يأتي الجزء التالي من تنفيذ الحركة واللógica باستخدام النواة

جزء الحركة عند عدم الضغط

mXiuyixiuButton.post(new Runnable() {
   @Override
   public void run() {
    clickCircleView = new ClickCircleView(CustomView1.this, mXiuyixiuButton.getWidth())
      , mXiuyixiuButton.getHeight(), mXiuyixiuLayout.getMeasuredWidth(),
      mXiuyixiuLayout.getMeasuredHeight());
    clickCircleView.setVisibility(View.VISIBLE);
    mXiuyixiuLayout.addView(clickCircleView);
    mXiuyixiuLayout.postInvalidate();
    // تحميل الحركة
    final Animator anim = AnimatorInflater.loadAnimator(CustomView1.this,
      R.animator.circle_scale_animator);
    anim.addListener(new AnimatorListenerAdapter() {
     @Override
     public void onAnimationEnd(Animator animation) {
      if (anim != null) {
       anim.start(); // تنفيذ الحركة التكرارية
      }
     }
    });
    anim.setTarget(clickCircleView);
    anim.start();
   }
  });

بعد إعداد clickCircleView، أضف هذا العنصر إلى التخطيط الأب، ثم قم بتحميل الحركة وإعداد التكرار، وأخيرًا استخدم postInvalidate() في نواة الفرعية لتحديث العنصر

جزء الحركة عند الضغط

mXiuyixiuButton.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    clickCircleView.setVisibility(View.GONE); // حجب عرض دائرة الإشارة، حيث سيتم إخفاء View الذي يحتوي على حركة الرسم التكرارية
    final ClickCircleView item = new ClickCircleView(CustomView1.this, mXiuyixiuButton.getWidth())
      , mXiuyixiuButton.getHeight(), mXiuyixiuLayout.getWidth(),
      mXiuyixiuLayout.getHeight());
    Animator spreadAnim = AnimatorInflater.loadAnimator(CustomView1.this,
      R.animator.circle_spread_animator);
    spreadAnim.addListener(new AnimatorListenerAdapter() {
     @Override
     public void onAnimationEnd(Animator animation) {
      item.setIsSpreadFlag(true);// علامة تنفيذ الرسوم المتحركة
     }
    });
    spreadAnim.setTarget(item);
    spreadAnim.start();
    clickCircleViewList.add(item);
    mXiuyixiuLayout.addView(item);
    mXiuyixiuLayout.invalidate();
    handler.post(circleViewRunnable);
   }
  });


إخفاء الرسوم المتحركة التي لا يتم ضغطها، بعد إعداد ClickCircleView أضف هذه الرسوم المتحركة إلى القائمة وأضفها إلى المخطط الأب، ثم قم بتحميل الرسوم المتحركة وأضف علامة isSpreadFlag عند انتهاء الرسوم المتحركة، وأخيرًا اضغط على invalidate() لتحديث الرسوم المتحركة وفتح الخيط

الجزء الخاص بالخيط

private Runnable circleViewRunnable = new Runnable() {
  public void run() {
   for (int i = 0; i < clickCircleViewList.size(); i++) {
    if (clickCircleViewList.get(i).isSpreadFlag()) {
     mXiuyixiuLayout.removeView(clickCircleViewList.get(i));
     clickCircleViewList.remove(i);
     mXiuyixiuLayout.postInvalidate();
    }
   }
   إذا كان حجم clickCircleViewList أقل أو يساوي 0 {
    clickCircleView.setVisibility(View.VISIBLE);
   }
   handler.postDelayed(this, 100);
  }
 };

استخدام list، أزيل view الذي يحتوي على علامة isSpreadFlag من list ومساحة التخطيط الأمامية، وأعد تحديث view، وأخيرًا إذا كان list فارغًا، يتم عرض الرسوم البيانية عند عدم النقر

تذكر في النهاية إزالة السطر في onDestroy()

@Override
 protected void onDestroy() {
  super.onDestroy();
  handler.removeCallbacks(circleViewRunnable);
 }

استخدام View المخصص مع حركة الرسم لتحقيق هذا التأثير يزيد من التكامل، ولكن هذا الأسلوب أكثر سلاسة من استخدام View المخصص بشكل كامل، والكثير من هذا الأسلوب يأتي من كتب المدونات الأخرى، ولكن إذا لم يتم جمعه وتلخيصه، فإنه لن يصبح معرفتك الخاصة، لذا أصبح هذا المدونة.

المرجع: طرق مختلفة لتحقيق نافذة Alipay Swipe Swipe باستخدام Android

هذا هو نهاية محتوى هذا المقال، آمل أن يساعدكم في التعلم، وآمل أن تحصلوا على دعم كبير لتعليم النطق.

البيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الأصلي بحقوق النشر، يتم جمع المحتوى من إسهامات المستخدمين عبر الإنترنت وتم تحميله بشكل تلقائي، ولا يملك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية ذات صلة. إذا اكتشفت محتوى مخالف للحقوق الملكية، فيرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (الرجاء استبدال # ب @ عند إرسال البريد الإلكتروني) للإبلاغ، وتقديم الدليل المناسب، وسيتم حذف المحتوى المزعوم فور التحقق منه.

سيحبك أيضًا