雙擊飛小心心-仿抖音點贊

自定義手勢識別


class MyOnGestureListener extends GestureDetector.SimpleOnGestureListener {

        @Override

        public boolean onDoubleTap(MotionEvent e) {

            addLoveView(e);

            return super.onDoubleTap(e);

        }

    }

private int x1;

private int y1;

private void addLoveView(MotionEvent e) {

float x =e.getRawX();

    float y =e.getRawY();

    if (x <100) {

x1 =102;

    }else {

x1 = (int)x;

    }

if (y <100) {

y1 =102;

    }else {

y1 = (int)y;

    }

if (mLove !=null) {

mLove.addLoveView(x1, y1);

    }

}

new一個GestureDetector


gestureDetector = new GestureDetector(getContext(), new MyOnGestureListener());

 

在onTouchEvent時候使用自定義的gestureDetector 記得要 return true


@Override

public boolean onTouchEvent(MotionEvent event) {

gestureDetector.onTouchEvent(event);

return true;

}

自定義RelativeLayout


public class Love extends RelativeLayout {

    private Context context;

    private LayoutParams params;

    private Drawable[] icons = new Drawable[4];

    private Interpolator[] interpolators = new Interpolator[4];

    private int mWidth;

    private int mHeight;

    public Love(Context context, AttributeSet attrs) {

        super(context, attrs);

        this.context = context;

        initView();

    }

    private void initView() {

        // 圖片資源

        icons[0] = getResources().getDrawable(R.drawable.heart_red);

        icons[1] = getResources().getDrawable(R.drawable.heart_red);

        icons[2] = getResources().getDrawable(R.drawable.heart_red);

        icons[3] = getResources().getDrawable(R.drawable.heart_red);

        // 插值器

        interpolators[0] = new AccelerateDecelerateInterpolator(); // 在動畫開始與結束的地方速率改變比較慢,在中間的時候加速

        interpolators[1] = new AccelerateInterpolator();  // 在動畫開始的地方速率改變比較慢,然後開始加速

        interpolators[2] = new DecelerateInterpolator(); // 在動畫開始的地方快然後慢

        interpolators[3] = new LinearInterpolator();  // 以常量速率改變

    }

    public void addLoveView(float x, float y) {

        mWidth = (int) (x - 100);

        mHeight = (int) (y - 100);

        final ImageView iv = new ImageView(context);

        params = new LayoutParams(200, 200);

        iv.setLayoutParams(params);

        iv.setImageDrawable(icons[new Random().nextInt(4)]);

        addView(iv);

        // 開啓動畫,並且用完銷燬

        AnimatorSet set = getAnimatorSet(iv);

        set.start();

        set.addListener(new AnimatorListenerAdapter() {

            @Override

            public void onAnimationEnd(Animator animation) {

                // TODO Auto-generated method stub

                super.onAnimationEnd(animation);

                removeView(iv);

            }

        });

    }

    /**

    * 獲取動畫集合

    *

    * @param iv

    */

    private AnimatorSet getAnimatorSet(ImageView iv) {

        // 1.alpha動畫

        ObjectAnimator alpha = ObjectAnimator.ofFloat(iv, "alpha", 0.3f, 1f);

        // 2.縮放動畫

        ObjectAnimator scaleX = ObjectAnimator.ofFloat(iv, "scaleX", 0.5f, 1.5f);

        ObjectAnimator scaleY = ObjectAnimator.ofFloat(iv, "scaleY", 0.5f, 1.5f);

        // 動畫集合

        AnimatorSet set = new AnimatorSet();

        set.playTogether(alpha, scaleX, scaleY);

        set.setDuration(2000);

        // 貝塞爾曲線動畫

        ValueAnimator bzier = getBzierAnimator(iv);

        AnimatorSet set2 = new AnimatorSet();

        set2.playTogether(set, bzier);

        set2.setTarget(iv);

        return set2;

    }

    /**

    * 貝塞爾動畫

    */

    private ValueAnimator getBzierAnimator(final ImageView iv) {

        // TODO Auto-generated method stub

        PointF[] PointFs = getPointFs(iv); // 4個點的座標

        BasEvaluator evaluator = new BasEvaluator(PointFs[1], PointFs[2]);

        ValueAnimator valueAnim = ValueAnimator.ofObject(evaluator, PointFs[0], PointFs[3]);

        valueAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override

            public void onAnimationUpdate(ValueAnimator animation) {

                // TODO Auto-generated method stub

                PointF p = (PointF) animation.getAnimatedValue();

                iv.setX(p.x);

                iv.setY(p.y);

                iv.setAlpha(1 - animation.getAnimatedFraction()); // 透明度

            }

        });

        valueAnim.setTarget(iv);

        valueAnim.setDuration(2000);

        valueAnim.setInterpolator(interpolators[new Random().nextInt(4)]);

        return valueAnim;

    }

    private PointF[] getPointFs(ImageView iv) {

        // TODO Auto-generated method stub

        PointF[] PointFs = new PointF[4];

        PointFs[0] = new PointF(); // p0

        PointFs[0].x = ((int) mWidth);

        PointFs[0].y = mHeight;

        PointFs[1] = new PointF(); // p1

        PointFs[1].x = new Random().nextInt(mWidth);

        PointFs[1].y = new Random().nextInt(mHeight / 2) + mHeight / 2 + params.height;

        PointFs[2] = new PointF(); // p2

        PointFs[2].x = new Random().nextInt(mWidth);

        PointFs[2].y = new Random().nextInt(mHeight / 2);

        PointFs[3] = new PointF(); // p3

        PointFs[3].x = new Random().nextInt(mWidth);

        PointFs[3].y = 0;

        return PointFs;

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章