实现滑动的方法
package lzl.edu.com.scrolldemos;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.Scroller;
public class MainActivity extends AppCompatActivity {
private ImageView mImageView;
private int lastX;
private int lastY;
private Scroller mScroll;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
mScroll = new Scroller(this);
mImageView = (ImageView) findViewById(R.id.mImageView);
/* mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent mIntent = new Intent(MainActivity.this, SlidScrollActivity.class);
startActivity(mIntent);
}
});*/
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//记录触摸到坐标
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
//记录偏移量坐标
int offsetX = x - lastX;
int offsetY = y - lastY;
//在当前的left top right bottom 上加上偏移量
/* 方法一:
mImageView.layout(mImageView.getLeft()+offsetX,mImageView.getTop()+offsetY,
mImageView.getRight()+offsetX,mImageView.getBottom()+offsetY);*/
Log.i("ACTION_MOVE","----x "+offsetX+"---y "+offsetY);
/*
方法二:
mImageView.offsetLeftAndRight(offsetX);
mImageView.offsetTopAndBottom(offsetY);
*/
/*
方法三:
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) mImageView.getLayoutParams();
layoutParams.leftMargin += offsetX;
layoutParams.topMargin += offsetY;
mImageView.setLayoutParams(layoutParams);
*/
/* 方法四:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mImageView.getLayoutParams();
Log.i("params"," left:"+mImageView.getLeft()+" top:"+mImageView.getTop());
layoutParams.leftMargin += offsetX;
layoutParams.topMargin += offsetY;
mImageView.setLayoutParams(layoutParams);*/
/*方法五
这个需要使用View所在的ViewGroup中来使用scrollBy方法
((View)mImageView.getParent()).scrollBy(-offsetX,-offsetY);
*/
//重新设置初始坐标
lastX = x;
lastY = y;
break;
}
return super.onTouchEvent(event);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="lzl.edu.com.scrolldemos.MainActivity">
<ImageView
android:id="@+id/mImageView"
android:src="@mipmap/ic_launcher"
android:layout_width="100dp"
android:layout_height="100dp"
/>
</RelativeLayout>
用ViewDragHelper实现侧滑菜单
MyDragLayout.java
package lzl.edu.com.scrolldemos.view;
import android.content.Context;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
/**
* Created by admin on 2015/12/1.
* 利用ViewDragHelper类来实现类似QQ侧滑的功能。这里只实现功能,并没有优化界面
* 1、初始化ViewDragHelper
* 2、拦截事件
* 3、处理computeScroll
* 4、处理回调CallBack 实现里面的方法
*
*/
public class MyViewDrag extends FrameLayout {
private ViewDragHelper mViewDragHelper;
private LinearLayout mLinearLeft,mLinearMain;
private int mWidth;
//处理回调
private ViewDragHelper.Callback callback = new ViewDragHelper.Callback(){
//
@Override
public boolean tryCaptureView(View child, int pointerId) {
//当触摸到主界面时,开始检测
return mLinearMain == child;
}
//向左滑动
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
return left;
}
//向下滑动,这里显示为0
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
return 0;
}
//拖动结束时调用
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
if(mLinearMain.getLeft()<500){
//当现做滑动小于500时,回到指定位置
mViewDragHelper.smoothSlideViewTo(mLinearMain,0,0);
ViewCompat.postInvalidateOnAnimation(MyViewDrag.this);
}else {
//打开左滑菜单
mViewDragHelper.smoothSlideViewTo(mLinearMain,300,0);
ViewCompat.postInvalidateOnAnimation(MyViewDrag.this);
}
}
};
public MyViewDrag(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
public MyViewDrag(Context context) {
this(context,null);
}
public MyViewDrag(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
/**
* 初始化布局
*/
private void initView(){
mViewDragHelper = ViewDragHelper.create(this,callback);
}
//拦截事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mViewDragHelper.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mViewDragHelper.processTouchEvent(event);
return true;
}
//加载完布局后调用
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mLinearLeft = (LinearLayout) getChildAt(0);
mLinearMain = (LinearLayout) getChildAt(1);
}
@Override
public void computeScroll() {
if(mViewDragHelper.continueSettling(true)){
ViewCompat.postInvalidateOnAnimation(this);
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = mLinearLeft.getWidth();
}
}
官方提供的DrawerLayout使用
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="lzl.edu.com.scrolldemos.activity.DrawerActivity">
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:background="#fff000"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
</RelativeLayout>
完整例子下载