package com.com.mr_wrong.SlideView; import android.content.Context; import android.util.AttributeSet; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import android.widget.Scroller; import android.widget.TextView; import com.Utils.Utils; import com.example.mr_wrong.androidstudioproject.R; /** * Created by Mr_Wrong on 2015/5/27. */ public class SlideView extends LinearLayout { private Context mContext; private LinearLayout mViewContent; private LinearLayout mHolder; private TextView tv_detele; private Scroller mScroll; private OnSlideListener mOnSlideListener; private int mHolderWidth = 100; private int mLastX = 0; private int mLastY = 0; private static final int TAN = 2; public SlideView(Context context) { this(context, null); } public SlideView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SlideView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { mContext = getContext(); mScroll = new Scroller(mContext); setOrientation(LinearLayout.HORIZONTAL); setGravity(Gravity.CENTER_VERTICAL); View.inflate(mContext, R.layout.slide_view, this); mViewContent = (LinearLayout) findViewById(R.id.view_content); mHolder = (LinearLayout) findViewById(R.id.holder); tv_detele = (TextView) findViewById(R.id.delete); } public void setButtonText(String text) { tv_detele.setText(text); } public void setContentView(View view) { mViewContent.addView(view); } public void onRequireTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); int scrollX = getScrollX(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (!mScroll.isFinished()) { mScroll.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; if (Math.abs(deltaX) < Math.abs(deltaY) * 2) { 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; Utils.Log("scrollX---", scrollX); if (scrollX > mHolderWidth * 0.75) { newscrollx = mHolderWidth; } else { newscrollx = 0; } smoothScrollTo(newscrollx, 0); if (mOnSlideListener != null) { mOnSlideListener.onSlide(this, newscrollx == 0 ? OnSlideListener.SLIDE_STATUS_OFF : OnSlideListener.SLIDE_STATUS_ON); } break; } mLastY = y; mLastX = x; } /** * 滚动到目标位置 * * @param x 目标x * @param y 目标y */ private void smoothScrollTo(int x, int y) { int scrollX = getScrollX(); int dx = x - scrollX; int scrollY = getScrollY(); int dy = y - scrollY; mScroll.startScroll(scrollX, scrollY, dx, dy, Math.abs(dx * 3)); invalidate(); } @Override public void computeScroll() { if (mScroll.computeScrollOffset()) { scrollTo(mScroll.getCurrX(), mScroll.getCurrY()); postInvalidate(); } super.computeScroll(); } public void setOnSlideListener(OnSlideListener listener) { this.mOnSlideListener = listener; } 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; public void onSlide(View view, int status); } }