加入天然拖动效果的ImageView与使用回弹库Facebook的信使聊天头信使、拖动、效果、ImageView

由网友(旧时光。)分享简介:我开发一个应用程序在那里,我在我的ImageView拖入活动。我已经配置 Facebook的反弹库 春季动画这是最初使用了Facebook Messenger的的聊天头动画。我想,当我将它拖到这样的动画添加到我的ImageView。视频 到目前为止,我能得到春天的动画,当我触摸ImageView的(上rootvi...

我开发一个应用程序在那里,我在我的ImageView拖入活动。 我已经配置 Facebook的反弹库 春季动画这是最初使用了Facebook Messenger的的聊天头动画。我想,当我将它拖到这样的动画添加到我的ImageView。    视频

到目前为止,我能得到春天的动画,当我触摸ImageView的(上rootview实施春季),这是我的code。我如何可以实现天然型拖曳效应,以我的ImageView的。

 公共类MainTry延伸活动{

    INT WINDOWWIDTH;
    INT WINDOWHEIGHT;

    私人的LayoutParams的LayoutParams;
    私人最终BaseSpringSystem mSpringSystem = SpringSystem.create();
    私人的FrameLayout mRootView;
    私人春春;
    私人查看mImageView;
    私人VelocityTracker速度= NULL;
    私人浮动DX;
    私人浮动DY;
    私人查看rootView;
    私人ImageView的IMG;

    @覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.layout);

    //创建系统运行物理学环为一组弹簧。
    SpringSystem springSystem = SpringSystem.create();

    //一个弹簧添加到该系统。
    春天= springSystem.createSpring();

    rootView = getWindow()。getDecorView()
            .findViewById(android.R.id.content);

    。WINDOWWIDTH = getWindowManager()getDefaultDisplay()的getWidth()。
    。WINDOWHEIGHT = getWindowManager()getDefaultDisplay()的getHeight();
    IMG =(ImageView的)findViewById(R.id.imageView2);

    rootView.setOnTouchListener(新View.OnTouchListener(){
        @覆盖
        公共布尔onTouch(视图V,MotionEvent事件){
            开关(event.getAction()){
            案例MotionEvent.ACTION_DOWN:
                // spring.setEndValue(1);
                打破;
            案例MotionEvent.ACTION_UP:
            案例MotionEvent.ACTION_CANCEL:
                // spring.setEndValue(0);
                打破;
            }
            返回true;
        }
    });
    //添加一个监听器来观察弹簧的运动。
    spring.addListener(新SimpleSpringListener(){

        @覆盖
        公共无效onSpringUpdate(春春){
            //你可以观察在春季更新
            //国家通过要求在onSpringUpdate其当前值。
            浮点值=(浮点)spring.getCurrentValue();
            浮规模= .5f  - (值* 0.1F);
            img.setScaleX(规模);
            img.setScaleY(规模);
        }
    });
    // spring.setEndValue(1);

    img.setOnTouchListener(新View.OnTouchListener(){

        @覆盖
        公共布尔onTouch(视图V,MotionEvent事件){
            的LayoutParams的LayoutParams =(的LayoutParams)IMG
                    .getLayoutParams();

            开关(event.getAction()){
            案例MotionEvent.ACTION_DOWN:
                DX = event.getRawX() -  10;
                DY = event.getRawY() -  10;

                如果(速度== NULL){
                    //获得一个新的VelocityTracker对象,监控
                    //运动的速度。
                    速度= VelocityTracker.obtain();
                } 其他 {
                    //重置速度跟踪回到它的初始状态。
                    velocity.clear();
                }
                打破;
            案例MotionEvent.ACTION_MOVE:
                DX = event.getRawX() -  10;
                DY = event.getRawY() -  10;


                velocity.addMovement(事件);
                spring.setVelocity(velocity.getYVelocity());
                spring.setCurrentValue(DY);
                spring.setEndValue(DY);


                layoutParams.leftMargin =(INT)DX  -  10;
                layoutParams.topMargin =(INT)DY  -  10;
                img.setLayoutParams(的LayoutParams);
                打破;
            案例MotionEvent.ACTION_CANCEL:
                打破;
            案例MotionEvent.ACTION_UP:
                velocity.addMovement(事件);
                spring.setVelocity(velocity.getYVelocity());
                spring.setCurrentValue(event.getRawY() -  10);
                spring.setEndValue(0);

                打破;

            默认:
                打破;
            }
            返回true;
        }
    });

}

@覆盖
公共无效onResume(){
    super.onResume();
}

@覆盖
公共无效的onPause(){
    super.onPause();
}


}
 

解决方案

怎么样的:

  V类扩展视图实现SpringListener {
    私有静态最终诠释NUM_ELEMS = 4;
    私人温泉[] mXSprings =新的春天[NUM_ELEMS]
    私人温泉[] mYSprings =新的春天[NUM_ELEMS]
    民营涂料mPaint =新的油漆();
    私人位图mBitmap = BitmapFactory.de codeResource(getResources(),R.drawable.ic_launcher);

    公共V(上下文的背景下){
        超(上下文);
        SpringSystem SS = SpringSystem.create();

        弹簧S;
        的for(int i = 0; I< NUM_ELEMS;我++){
            S = ss.createSpring();
            s.setSpringConfig(新MySpringConfig(200,我== 0 8:15 + I * 2,我,真));
            s.addListener(本);
            mXSprings [I] =秒;

            S = ss.createSpring();
            s.setSpringConfig(新MySpringConfig(200,我== 0 8:15 + I * 2,我,FALSE));
            s.addListener(本);
            mYSprings [I] =秒;
        }
    }

    @覆盖
    保护无效onSizeChanged(INT W,INT小时,INT oldw,诠释oldh){
        mXSprings [0] .setCurrentValue(瓦特/ 2);
        mYSprings [0] .setCurrentValue(0);

        mXSprings [0] .setEndValue(瓦特/ 2);
        mYSprings [0] .setEndValue(H / 2);
    }

    @覆盖
    公共无效onSpringActivate(弹簧S){
    }

    @覆盖
    公共无效onSpringAtRest(弹簧S){
    }

    @覆盖
    公共无效onSpringEndStateChange(弹簧S){
    }

    @覆盖
    公共无效onSpringUpdate(弹簧S){
        MySpringConfig CFG =(MySpringConfig)s.getSpringConfig();
        如果(cfg.index< NUM_ELEMS  -  1){
            春天[]弹簧= cfg.horizo​​ntal? mXSprings:mYSprings;
            弹簧[cfg.index + 1〕.setEndValue(s.getCurrentValue());
        }
        如果(cfg.index == 0){
            无效();
        }
    }

    @覆盖
    公共布尔的onTouchEvent(MotionEvent事件){
        mXSprings [0] .setEndValue(event.getX());
        mYSprings [0] .setEndValue(event.getY());
        返回true;
    }

    @覆盖
    保护无效的OnDraw(帆布油画){
        的for(int i = NUM​​_ELEMS  -  1; I> = 0;我 - ){
            mPaint.setAlpha(我== 0 255:192  -  I * 128 / NUM_ELEMS);
            canvas.drawBitmap(mBitmap,
                    (浮点型)mXSprings [I] .getCurrentValue() -  mBitmap.getWidth()/ 2,
                    (浮点型)mYSprings [I] .getCurrentValue() -  mBitmap.getHeight()/ 2,
                    mPaint);
        }
    }

    类MySpringConfig扩展SpringConfig {
        INT指数;
        布尔水平;
        公共MySpringConfig(双张力,双摩擦,INT指数,布尔水平){
            超(紧张,摩擦);
            this.index =指数;
            this.horizo​​ntal =水平;
        }
    }
}
 

怎样利用Facebook搜索 推广视频 选出潜在爆品

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 Facebook Messenger's chat heads animations. I want to add this kind of animations to my ImageView when I drag it. VIDEO

So far I am able to get spring animation when I touch ImageView (implemented spring on rootview), this is my code. How can I implement that natural type of dragging effect to my ImageView.

public class MainTry extends Activity {

    int windowwidth;
    int windowheight;

    private LayoutParams layoutParams;
    private final BaseSpringSystem mSpringSystem = SpringSystem.create();
    private FrameLayout mRootView;
    private Spring spring;
    private View mImageView;
    private VelocityTracker velocity = null;
    private float dx;
    private float dy;
    private View rootView;
    private ImageView img;

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout);

    // Create a system to run the physics loop for a set of springs.
    SpringSystem springSystem = SpringSystem.create();

    // Add a spring to the system.
    spring = springSystem.createSpring();

    rootView = getWindow().getDecorView()
            .findViewById(android.R.id.content);

    windowwidth = getWindowManager().getDefaultDisplay().getWidth();
    windowheight = getWindowManager().getDefaultDisplay().getHeight();
    img = (ImageView) findViewById(R.id.imageView2);

    rootView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // spring.setEndValue(1);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                // spring.setEndValue(0);
                break;
            }
            return true;
        }
    });
    // Add a listener to observe the motion of the spring.
    spring.addListener(new SimpleSpringListener() {

        @Override
        public void onSpringUpdate(Spring spring) {
            // You can observe the updates in the spring
            // state by asking its current value in onSpringUpdate.
            float value = (float) spring.getCurrentValue();
            float scale = .5f - (value * 0.1f);
            img.setScaleX(scale);
            img.setScaleY(scale);
        }
    });
    // spring.setEndValue(1);

    img.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            LayoutParams layoutParams = (LayoutParams) img
                    .getLayoutParams();

            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                dx = event.getRawX() - 10;
                dy = event.getRawY() - 10;

                if (velocity == null) {
                    // Retrieve a new VelocityTracker object to watch the
                    // velocity of a motion.
                    velocity = VelocityTracker.obtain();
                } else {
                    // Reset the velocity tracker back to its initial state.
                    velocity.clear();
                }
                break;
            case MotionEvent.ACTION_MOVE:
                dx = event.getRawX() - 10;
                dy = event.getRawY() - 10;


                velocity.addMovement(event);
                spring.setVelocity(velocity.getYVelocity());
                spring.setCurrentValue(dy);
                spring.setEndValue(dy);


                layoutParams.leftMargin = (int) dx - 10;
                layoutParams.topMargin = (int) dy - 10;
                img.setLayoutParams(layoutParams);
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            case MotionEvent.ACTION_UP:
                velocity.addMovement(event);
                spring.setVelocity(velocity.getYVelocity());
                spring.setCurrentValue(event.getRawY() - 10);
                spring.setEndValue(0);

                break;

            default:
                break;
            }
            return true;
        }
    });

}

@Override
public void onResume() {
    super.onResume();
}

@Override
public void onPause() {
    super.onPause();
}


}

解决方案

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;
        }
    }
}

阅读全文

相关推荐

最新文章