您的位置:首页 > 移动开发 > Android开发

Android 使用Scroller来实现item滑动删除

2017-10-13 01:27 489 查看

Android 使用Scroller来滑动到指定的位置实现item过度效果,通过scrollBy()方法进行持续滑动。



自定义控件实现让自己的view变得绚丽多彩,简单来实现通过滑动item来点击删除。先来定义一个自定View,继承LinearLayout实现OnTouchListener接口,后面通过该接口的方法进行回调。

package map.example.com.scrollerandview;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Scroller;

/**
* Created by wg on 2017/10/11.
*/

public class SlidingLinearLayout extends LinearLayout implements View.OnTouchListener {

//使用Scroller来实现滑动过度效果
private Scroller mScroller = new Scroller(getContext());

//记录正在移动中的值
private int tempX;

//正在移动的点的值
private int moveX;

//控制滑动的方向,第一次从左往右可以进行滑动
private boolean isLeftMove = true;

//第一次从右往左不可滑动
private boolean isRightMove = false;

//用来存放子view的宽度
private int[] viewWidths = new int[3];

//隐藏view的宽度
private int hideViewWidth;

//指定滑动距离超过100时松开手判断最终的滑动
private int distance = 100;

public SlidingLinearLayout(Context context) {
super(context);
init();
}

public SlidingLinearLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}

public SlidingLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}

private void init() {
//设置监听器通过回调来调用接口中方法
setOnTouchListener(this);

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//获取每个子view的宽度存入viewWidths数组中
for (int i = 0; i < getChildCount(); i++) {
//getChilt(i) 获取第i个view的对象,getMeasuredWidth() 获取测量的宽度
viewWidths[i] = getChildAt(i).getMeasuredWidth();
}
//计算隐藏view的总宽度
hideViewWidth = viewWidths[1] + viewWidths[2];
}

@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
//通过scrollTo移动到给定的位置
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
//重绘执行computeScroll()方法
postInvalidate();
}
}

public void smoothScrollTo(int destX) {
int scrollX = getScrollX();
int deltaX = destX - scrollX;
//0.5s内移动view内容
mScroller.startScroll(scrollX, 0, deltaX, 0, 500);
//重绘执行computeScroll()方法
invalidate();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
//处理移动
move(event);
return true;
}

private void move(MotionEvent event) {
//获取滑动的值,向左滑动scrollX值增大,向右滑动scrollX值减小
int scrollX = getScrollX();

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN: {
//记录按下的值
tempX = (int) event.getX();
break;
}

case MotionEvent.ACTION_MOVE: {
//记录当前正在移动的值
moveX = (int) event.getX();

//向左滑动,scrollX的值小于hideViewWidth,最后一个view右边在屏幕最右边
if (moveX < tempX && scrollX < hideViewWidth) {
//通过向左滑动差值进行移动
scrollBy(tempX - moveX, 0);

}

//向右滑动,使scroll的值大于0,第一个view左边与在屏幕最左边
if (moveX > tempX && scrollX > 0) { //向右滑动
//通过向右滑动差值进行移动
scrollBy(tempX - moveX, 0);

}

//向右滑动到左边界时,第一个view的左边在屏幕最左边的右边时,则将view左边移动到屏幕的最左边
if (scrollX < 0) {
scrollTo(0, 0);
}

//向左滑动到右边界时,第一个view的右边在屏幕最右边的左边时,则将view右边移动到屏幕的最右边
if (scrollX > hideViewWidth) {
scrollTo(hideViewWidth, 0);
}

//保留移动点的距离
tempX = moveX;

break;
}

case MotionEvent.ACTION_UP: {
// isLeftMove 默认是true
// isRightMove 默认是false
//view处于屏幕左边界状态,从右向左滑动,scrollX大于distance时,将滑动view处于右边界状态
if (scrollX > distance && isLeftMove) {
//滑动到右边界状态
smoothScrollTo(hideViewWidth);
//手势向左滑动无效
isLeftMove = false;
//手势可以向右滑动
isRightMove = true;
} else if (scrollX < hideViewWidth - distance && isRightMove) { //view处于屏幕右边界状态,从左向右滑动,scrollX小于hideViewWidth - distance时,将滑动view处于左边界状态
//滑动到左边界状态
smoothScrollTo(0);
//手势可以向左滑动
isLeftMove = true;
//手势向右滑动无效
isRightMove = false;
}

//处于左边界时,当滑动的scrollX的值小于distance时,则还是处于左边界
if (scrollX < distance && isLeftMove) {
//滑动到左边界
smoothScrollTo(0);
} else if (scrollX > hideViewWidth - distance && isRightMove) {//处于右边界时,当滑动的scrollX的值大于hideViewWidth - distance时,则还是处于右边界
//滑动到右边界
smoothScrollTo(hideViewWidth);
}

break;
}

default:
break;
}

}
}


在activity_main使用自定义的SlidingLinearLayout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="map.example.com.scrollerandview.MainActivity">

<map.example.com.scrollerandview.SlidingLinearLayout
android:id="@+id/sliding_linearlayout2"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal">

<TextView
android:id="@+id/content_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Scroller And View"
android:background="#8DC3CF"
android:gravity="center_vertical"
android:textSize="18dp">

</TextView>

<Button
android:id="@+id/delete_but"
android:layout_width="100dp"
android:layout_height="match_parent"
android:text="Delete"
android:background="#ff0000"
android:textColor="#ffffff"
android:textSize="18dp"
android:gravity="center"/>

<Button
android:id="@+id/istop_but"
android:layout_width="100dp"
android:layout_height="match_parent"
android:text="Istop"
android:background="#ffff00"
android:textColor="#ffffff"
android:textSize="18dp"
android:gravity="center"/>

</map.example.com.scrollerandview.SlidingLinearLayout>

</LinearLayout>


在MainActivity中监听delete按钮在onClick方法toast

package map.example.com.scrollerandview;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Context mContext = this;
findViewById(R.id.delete_but).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext,"删除",Toast.LENGTH_SHORT).show();
}
});
}


总结:Scroller实现view缓慢移动到指定位置的内容进行移动,scrollBy()移动内容的位置,不会更改view的实际位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐