package com.tumblr.backboard.example; import android.annotation.SuppressLint; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import com.facebook.rebound.Spring; import com.facebook.rebound.SpringSystem; import com.tumblr.backboard.performer.Performer; /** * Scale a view with a finger. * <p/> * Created by ericleong on 5/7/14. */ public class ScaleFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.fragment_scale, container, false); final View rect = rootView.findViewById(R.id.rect); final SpringSystem springSystem = SpringSystem.create(); final Spring spring = springSystem.createSpring(); spring.addListener(new Performer(rect, View.SCALE_X)); spring.addListener(new Performer(rect, View.SCALE_Y)); rootView.setOnTouchListener(new View.OnTouchListener() { @Override @SuppressLint("ClickableViewAccessibility") public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: spring.setVelocity(0); case MotionEvent.ACTION_MOVE: // can't use Imitation here because there is no nice mapping from // an event property to a Spring float scaleX, scaleY; float delta = event.getX() - (rect.getX() + rect.getMeasuredWidth() / 2); scaleX = Math.abs(delta) / (rect.getMeasuredWidth() / 2); delta = event.getY() - (rect.getY() + rect.getMeasuredHeight() / 2); scaleY = Math.abs(delta) / (rect.getMeasuredHeight() / 2); float scale = Math.max(scaleX, scaleY); spring.setEndValue(scale); break; case MotionEvent.ACTION_UP: spring.setEndValue(1f); break; } return true; } }); return rootView; } }