一、前言
老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相!现在大家一睹为快!
二、比较关键的还是scroller这个类的
- package com.icq.slideview.view;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.util.TypedValue;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.LinearLayout;
- import android.widget.RelativeLayout;
- import android.widget.Scroller;
- import android.widget.TextView;
- import com.icq.slideview.R;
- public class SlideView extends LinearLayout {
- private static final String TAG = "SlideView";
- private Context mContext;
- private LinearLayout mViewContent;
- private RelativeLayout mHolder;
- private Scroller mScroller;
- private OnSlideListener mOnSlideListener;
- private int mHolderWidth = 120;
- private int mLastX = 0;
- private int mLastY = 0;
- private static final int TAN = 2;
- public interface OnSlideListener {
- public static final int SLIDE_STATUS_OFF = 0;
- public static final int SLIDE_STATUS_START_SCROLL = 1;
- public static final int SLIDE_STATUS_ON = 2;
- /**
- * @param view current SlideView
- * @param status SLIDE_STATUS_ON or SLIDE_STATUS_OFF
- */
- public void onSlide(View view, int status);
- }
- public SlideView(Context context) {
- super(context);
- initView();
- }
- public SlideView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initView();
- }
- private void initView() {
- mContext = getContext();
- mScroller = new Scroller(mContext);
- setOrientation(LinearLayout.HORIZONTAL);
- View.inflate(mContext, R.layout.slide_view_merge, this);
- mViewContent = (LinearLayout) findViewById(R.id.view_content);
- mHolderWidth = Math.round(TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources()
- .getDisplayMetrics()));
- }
- public void setButtonText(CharSequence text) {
- ((TextView)findViewById(R.id.delete)).setText(text);
- }
- public void setContentView(View view) {
- mViewContent.addView(view);
- }
- public void setOnSlideListener(OnSlideListener onSlideListener) {
- mOnSlideListener = onSlideListener;
- }
- public void shrink() {
- if (getScrollX() != 0) {
- this.smoothScrollTo(0, 0);
- }
- }
- public void onRequireTouchEvent(MotionEvent event) {
- int x = (int) event.getX();
- int y = (int) event.getY();
- int scrollX = getScrollX();
- Log.d(TAG, "x=" + x + " y=" + y);
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN: {
- int deltaX = x - mLastX;
- System.out.println("按下偏移"+deltaX);
- if (!mScroller.isFinished()) {
- mScroller.abortAnimation();
- }
- if (mOnSlideListener != null) {
- mOnSlideListener.onSlide(this,
- OnSlideListener.SLIDE_STATUS_START_SCROLL);
- }
- break;
- }
- case MotionEvent.ACTION_MOVE: {
- int deltaX = x - mLastX;
- int deltaY = y - mLastY;
- System.out.println("偏移"+deltaX);
- if (Math.abs(deltaX) < Math.abs(deltaY) * TAN) {
- break;
- }
- int newScrollX = scrollX - deltaX;
- if (deltaX != 0) {
- if (newScrollX < 0) {
- newScrollX = 0;
- } else if (newScrollX > mHolderWidth) {
- newScrollX = mHolderWidth;
- }
- this.scrollTo(newScrollX, 0);
- }
- break;
- }
- case MotionEvent.ACTION_UP: {
- int newScrollX = 0;
- if (scrollX - mHolderWidth * 0.75 > 0) {
- newScrollX = mHolderWidth;
- }
- this.smoothScrollTo(newScrollX, 0);
- if (mOnSlideListener != null) {
- mOnSlideListener.onSlide(this,
- newScrollX == 0 ? OnSlideListener.SLIDE_STATUS_OFF
- : OnSlideListener.SLIDE_STATUS_ON);
- }
- break;
- }
- default:
- break;
- }
- mLastX = x;
- mLastY = y;
- }
- private void smoothScrollTo(int destX, int destY) {
- // 缓慢滚动到指定位置
- int scrollX = getScrollX();
- int delta = destX - scrollX;
- System.out.println("偏移scrollX"+scrollX);
- System.out.println("偏移差delta"+delta);
- int a= Math.abs(delta) * 3;
- System.out.println("什么意思"+a);
- mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3);
- invalidate();
- }
- @Override
- public void computeScroll() {
- if (mScroller.computeScrollOffset()) {
- System.out.println("当前x位置:"+mScroller.getCurrX());
- System.out.println("当前Y位置:"+mScroller.getCurrY());
- scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
- postInvalidate();
- }
- }
- }
三、直接源码下载了:最近总结一下,csdn在我看来最近没有那么活跃了,真正的大牛已经很少在csdn发微博了,都去了github、stackoverflow、eoe等网站了!哎,逼于无奈我后期也得转移阵地了!