Naar content
Trending apps
  • Inbox by Gmail

  • Maps: Navigatie en OV

  • WhatsApp Messenger

  • Messenger

  • Facebook

Trending games
  • Minecraft Earth

  • Dr. Mario World

  • Harry Potter: Wizards Unite

  • Breaking Bad: Criminal Elements

  • The Elder Scrolls: Blades

Trending smartphones
  • Realme X2 Pro

  • Moto G8 Plus

  • Microsoft Surface Duo

  • OnePlus 7T Pro

  • Nokia 7.2

Nieuwste tablets
  • Samsung Galaxy Tab S6

  • Samsung Galaxy Tab A 10.5

  • Samsung Galaxy Tab S4

  • Samsung Galaxy Tab S3 9.7

  • Asus Zenpad 3S 10

tim687

tim687

  • Lid sinds 11 juli 2011
  • Berichten 418
  • Reputatie 0
  • #1
  • 22 juli 2014
  • 12:04

Beste leden,
Ik ben bezig met een app die gebruik maakt van swipen.
Als ik nu zou swipen, dan gaat de view alleen in een rechte lijn naar links of naar rechts.
Ik wil er wat speels va maken door te zorgen dat hij niet in een rechte lijn gaat, maar de vinger van de gebruiker volgt.
Ik heb hier de code, maar ik zou niet weten waar ik moet beginnen.

Wie kan mij helpen?

/**
 * A {@link android.view.View.OnTouchListener} that makes any {@link View}
 * dismissable when the user swipes (drags her finger) horizontally across the
 * view.
 * 
 * <p>
 * <em>For {@link android.widget.ListView} list items that don't manage their own touch events
 * (i.e. you're using
 * {@link android.widget.ListView#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener)}
 * or an equivalent listener on {@link android.app.ListActivity} or
 * {@link android.app.ListFragment}, use {@link SwipeDismissListViewTouchListener} instead.</em>
 * </p>
 * 
 * <p>
 * Example usage:
 * </p>
 * 
 * <pre>
 * view.setOnTouchListener(new SwipeDismissTouchListener(view, null, // Optional
 * 																	// token/cookie
 * 																	// object
 * 		new SwipeDismissTouchListener.OnDismissCallback() {
 * 			public void onDismiss(View view, Object token) {
 * 				parent.removeView(view);
 * 			}
 * 		}));
 * </pre>
 * 
 * <p>
 * This class Requires API level 12 or later due to use of
 * {@link android.view.ViewPropertyAnimator}.
 * </p>
 * 
 * @see SwipeDismissListViewTouchListener
 */
public class SwipeDismissTouchListener implements View.OnTouchListener {
	// Cached ViewConfiguration and system-wide constant values
	private int mSlop;
	private int mMinFlingVelocity;
	private int mMaxFlingVelocity;
	private long mAnimationTime;
	// Fixed properties
	private View mView;
	private OnDismissCallback mCallback;
	private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero
	// Transient properties
	private float mDownX;
	private boolean mSwiping;
	private Object mToken;
	private VelocityTracker mVelocityTracker;
	private float mTranslationX;
	/**
	 * The callback interface used by {@link SwipeDismissTouchListener} to
	 * inform its client about a successful dismissal of the view for which it
	 * was created.
	 */
	public interface OnDismissCallback {
		/**
		 * Called when the user has indicated they she would like to dismiss the
		 * view.
		 * 
		 * @param view
		 *            The originating {@link View} to be dismissed.
		 * @param token
		 *            The optional token passed to this object's constructor.
		 */
		public void onDismiss(View view, Object token);
	}
	/**
	 * Constructs a new swipe-to-dismiss touch listener for the given view.
	 * 
	 * @param view
	 *            The view to make dismissable.
	 * @param token
	 *            An optional token/cookie object to be passed through to the
	 *            callback.
	 * @param callback
	 *            The callback to trigger when the user has indicated that she
	 *            would like to dismiss this view.
	 */
	public SwipeDismissTouchListener(View view, Object token,
			OnDismissCallback callback) {
		ViewConfiguration vc = ViewConfiguration.get(view.getContext());
		mSlop = vc.getScaledTouchSlop() * 2;
		mMinFlingVelocity = vc.getScaledMinimumFlingVelocity();
		mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();
		mAnimationTime = view.getContext().getResources()
				.getInteger(android.R.integer.config_shortAnimTime);
		mView = view;
		mToken = token;
		mCallback = callback;
	}
	@Override
	public boolean onTouch(View view, MotionEvent motionEvent) {
		// offset because the view is translated during swipe
		motionEvent.offsetLocation(mTranslationX, 0);
		if (mViewWidth < 2) {
			mViewWidth = mView.getWidth();
		}
		switch (motionEvent.getActionMasked()) {
		case MotionEvent.ACTION_DOWN: {
			// TODO: ensure this is a finger, and set a flag
			mDownX = motionEvent.getRawX();
			mVelocityTracker = VelocityTracker.obtain();
			mVelocityTracker.addMovement(motionEvent);
			//view.onTouchEvent(motionEvent);
			return false;
		}
		case MotionEvent.ACTION_UP: {
			if (mVelocityTracker == null) {
				break;
			}
			float deltaX = motionEvent.getRawX() - mDownX;
			mVelocityTracker.addMovement(motionEvent);
			mVelocityTracker.computeCurrentVelocity(1000);
			float velocityX = Math.abs(mVelocityTracker.getXVelocity());
			float velocityY = Math.abs(mVelocityTracker.getYVelocity());
			boolean dismiss = false;
			boolean dismissRight = false;
			if (Math.abs(deltaX) > mViewWidth / 2) {
				dismiss = true;
				dismissRight = deltaX > 0;
			} else if (mMinFlingVelocity <= velocityX
					&& velocityX <= mMaxFlingVelocity && velocityY < velocityX) {
				dismiss = true;
				dismissRight = mVelocityTracker.getXVelocity() > 0;
			}
			if (dismiss) {
				// dismiss
				animate(mView)
						.translationX(dismissRight ? mViewWidth : -mViewWidth)
						.alpha(0).setDuration(mAnimationTime)
						.setListener(new AnimatorListener() {
							@Override
							public void onAnimationStart(Animator arg0) {
								// TODO Auto-generated method stub
							}
							@Override
							public void onAnimationRepeat(Animator arg0) {
								// TODO Auto-generated method stub
							}
							@Override
							public void onAnimationEnd(Animator arg0) {
								performDismiss();
							}
							@Override
							public void onAnimationCancel(Animator arg0) {
								// TODO Auto-generated method stub
							}
						});
			} else {
				// cancel
				animate(mView).translationX(0).alpha(1)
						.setDuration(mAnimationTime).setListener(null);
			}
			mVelocityTracker.recycle();
			mVelocityTracker = null;
			mTranslationX = 0;
			mDownX = 0;
			mSwiping = false;
			break;
		}
		case MotionEvent.ACTION_MOVE: {
			if (mVelocityTracker == null) {
				break;
			}
			mVelocityTracker.addMovement(motionEvent);
			float deltaX = motionEvent.getRawX() - mDownX;
			if (Math.abs(deltaX) > mSlop) {
				mSwiping = true;
				mView.getParent().requestDisallowInterceptTouchEvent(true);
				// Cancel listview's touch
				MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);
				cancelEvent
						.setAction(MotionEvent.ACTION_CANCEL
								| (motionEvent.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
				mView.onTouchEvent(cancelEvent);
				cancelEvent.recycle();
			}
			if (mSwiping) {
				mTranslationX = deltaX;
				ViewHelper.setTranslationX(mView, deltaX);
				// TODO: use an ease-out interpolator or such
				setAlpha(
						mView,
						Math.max(
								0f,
								Math.min(1f, 1f - 2f * Math.abs(deltaX)
										/ mViewWidth)));
				return true;
			}
			break;
		}
		}
		return false;
	}
	private void performDismiss() {
		// Animate the dismissed view to zero-height and then fire the dismiss
		// callback.
		// This triggers layout on each animation frame; in the future we may
		// want to do something
		// smarter and more performant.
		final ViewGroup.LayoutParams lp = mView.getLayoutParams();
		final int originalHeight = mView.getHeight();
		ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 1)
				.setDuration(mAnimationTime);
		animator.addListener(new AnimatorListenerAdapter() {
			@Override
			public void onAnimationEnd(Animator animation) {
				mCallback.onDismiss(mView, mToken);
				// Reset view presentation
				setAlpha(mView, 1f);
				ViewHelper.setTranslationX(mView, 0);
				// mView.setAlpha(1f);
				// mView.setTranslationX(0);
				lp.height = originalHeight;
				mView.setLayoutParams(lp);
			}
		});
		animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
			@Override
			public void onAnimationUpdate(ValueAnimator valueAnimator) {
				lp.height = (Integer) valueAnimator.getAnimatedValue();
				mView.setLayoutParams(lp);
			}
		});
		animator.start();
	}
}

zandehr

zandehr

  • Lid sinds 23 juli 2014
  • Berichten 7
  • Reputatie 0
  • #2
  • 23 juli 2014
  • 21:58

Hier kan je de gesture detector voor gebruiken.

Bewerkt (23 juli 2014 22:00)
tim687

tim687

  • Lid sinds 11 juli 2011
  • Berichten 418
  • Reputatie 0
  • #3
  • 24 juli 2014
  • 14:34

In mijn code zit denk ik al een gesture detector aangezien hij al naar rechts en naar links gaat als je sleept.

Reageer

Om te reageren, dien je te zijn ingelogd. Druk op de onderstaande knop om in te loggen of maak een nieuwe account aan.

Inloggen Registreren