Adding natural dragging effect to ImageView same as Facebook Messanger chat heads using Rebound library

前端 未结 2 1803
广开言路
广开言路 2020-12-09 06:26

I am developing one app where I am dragging around my ImageView in Activity. I have configured Facebook Rebound library for spring animation which is originally used in Face

相关标签:
2条回答
  • 2020-12-09 06:55

    i have used above V class directly in Window-manager and it's work perfectly and chatHead move like facebook messenger.

    public class ChatHeadService extends Service
    {
    
        private LayoutInflater inflater;
        private WindowManager windowManager;
    
        private Point szWindow = new Point();
    
    
        @Override
        public void onCreate()
        {
        super.onCreate();
        Log.v(Utils.LogTag, "Start Service");
        }
    
        private
        void handleStart(){
    
             windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
            inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
    
            if (Build . VERSION . SDK_INT >= Build . VERSION_CODES . HONEYCOMB) {
                windowManager . getDefaultDisplay() . getSize(szWindow);
            } else {
                int w = windowManager . getDefaultDisplay() . getWidth();
                int h = windowManager . getDefaultDisplay() . getHeight();
                szWindow . set(w, h);
            }
    
            WindowManager . LayoutParams params = new WindowManager . LayoutParams(
                WindowManager . LayoutParams . WRAP_CONTENT,
                WindowManager . LayoutParams . WRAP_CONTENT,
                WindowManager . LayoutParams . TYPE_PHONE,
                WindowManager . LayoutParams . FLAG_NOT_FOCUSABLE |
                WindowManager . LayoutParams . FLAG_WATCH_OUTSIDE_TOUCH |
                WindowManager . LayoutParams . FLAG_LAYOUT_NO_LIMITS,
                PixelFormat . TRANSLUCENT
            );
    
            params . gravity = Gravity . TOP | Gravity . LEFT;
            params . x       = 50;
            params . y       = 100;
    
            V vImg = new V(this);
    
            windowManager . addView(vImg, params);
    
    
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            if (intent != null) {
                if (startId == Service . START_STICKY) {
                    handleStart();
                }
            }
    
            return super . onStartCommand(intent, flags, startId);
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onDestroy(){
                    super . onDestroy();
            if (windowManager != null) {
                // windowManager.removeView(chatHeadView);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-09 06:56

    what about this:

    class V extends View implements SpringListener {
        private static final int NUM_ELEMS = 4;
        private Spring[] mXSprings = new Spring[NUM_ELEMS];
        private Spring[] mYSprings = new Spring[NUM_ELEMS];
        private Paint mPaint = new Paint();
        private Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    
        public V(Context context) {
            super(context);
            SpringSystem ss = SpringSystem.create();
    
            Spring s;
            for (int i = 0; i < NUM_ELEMS; i++) {
                s = ss.createSpring();
                s.setSpringConfig(new MySpringConfig(200, i == 0? 8 : 15 + i * 2, i, true));
                s.addListener(this);
                mXSprings[i] = s;
    
                s = ss.createSpring();
                s.setSpringConfig(new MySpringConfig(200, i == 0? 8 : 15 + i * 2, i, false));
                s.addListener(this);
                mYSprings[i] = s;
            }
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            mXSprings[0].setCurrentValue(w / 2);
            mYSprings[0].setCurrentValue(0);
    
            mXSprings[0].setEndValue(w / 2);
            mYSprings[0].setEndValue(h / 2);
        }
    
        @Override
        public void onSpringActivate(Spring s) {
        }
    
        @Override
        public void onSpringAtRest(Spring s) {
        }
    
        @Override
        public void onSpringEndStateChange(Spring s) {
        }
    
        @Override
        public void onSpringUpdate(Spring s) {
            MySpringConfig cfg = (MySpringConfig) s.getSpringConfig();
            if (cfg.index < NUM_ELEMS - 1) {
                Spring[] springs = cfg.horizontal? mXSprings : mYSprings;
                springs[cfg.index + 1].setEndValue(s.getCurrentValue());
            }
            if (cfg.index == 0) {
                invalidate();
            }
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            mXSprings[0].setEndValue(event.getX());
            mYSprings[0].setEndValue(event.getY());
            return true;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            for (int i = NUM_ELEMS - 1; i >= 0; i--) {
                mPaint.setAlpha(i == 0? 255 : 192 - i * 128 / NUM_ELEMS);
                canvas.drawBitmap(mBitmap, 
                        (float) mXSprings[i].getCurrentValue() - mBitmap.getWidth() / 2,
                        (float) mYSprings[i].getCurrentValue() - mBitmap.getHeight() / 2,
                        mPaint);
            }
        }
    
        class MySpringConfig extends SpringConfig {
            int index;
            boolean horizontal;
            public MySpringConfig(double tension, double friction, int index, boolean horizontal) {
                super(tension, friction);
                this.index = index;
                this.horizontal = horizontal;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题