学习滑动的基本方式(群英传第五章):
群英传第五章Android Scroll分析(学习参考)
1、layout 方法
2、setLayoutParams方法
通过改变LayoutParams来动态的修改一个布局的参数,从而达到改变View 位置的效果。
3、通过srcollBy移动父View 的位置,来显示相对的子View 在移动。
4、使用Scroller类来进行平滑的移动
学习代码:
布局文件 :activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="mw.huawei.com.scrollone.MainActivity">
<mw.huawei.com.scrollone.MyView
android:id="@+id/myView"
android:background="#f0f"
android:layout_width="40dp"
android:layout_height="40dp" />
</RelativeLayout>
自定义的View:
package mw.huawei.com.scrollone;
import android.content.Context;
import android.support.annotation.Nullable;
import android.text.Layout;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller;
/**
* Created by Administrator on 2018/5/3.
*/
public class MyView extends View {
private Scroller mSrcoll;
private int mLastX;
private int mLastY;
public MyView(Context context) {
this(context,null);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mSrcoll = new Scroller(context);
}
@Override
public void computeScroll() {
super.computeScroll();
Log.d("TAG#######",mSrcoll.computeScrollOffset()+"");
//判断Scroll 是否执行完毕
if (mSrcoll.computeScrollOffset()){
((View)getParent()).scrollTo(mSrcoll.getCurrX(),mSrcoll.getCurrY());
invalidate();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int rawX = (int) event.getRawX(); //获取绝对坐标
int rawY = (int) event.getRawY();
Log.d("TAG====","rawX = " +rawX +","+"rowY"+rawY);
switch (event.getAction()){
case MotionEvent.ACTION_UP:
View viewGroup = (View) getParent();
mSrcoll.startScroll(
viewGroup.getScrollX(),
viewGroup.getScrollY(),
-viewGroup.getScrollX(),
-viewGroup.getScrollY(),1000);
invalidate();
break;
case MotionEvent.ACTION_DOWN:
mLastX = rawX;
mLastY = rawY;
break;
case MotionEvent.ACTION_MOVE:
Log.d("TAG*****","rawX = " +rawX +","+"rowY"+rawY);
int offsetX = rawX - mLastX;
int offsetY = rawY - mLastY;
// 方法1: 通过layout 来进行位置的摆放
/* layout(getLeft()+offsetX,
getTop()+offsetY,
getRight()+offsetX,
getBottom()+offsetY);*/
// 方法2: 通过设置改View 所在的父布局的左边距和上边距来进行摆放
/*ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft()+offsetX;
layoutParams.topMargin = getTop()+offsetY;
setLayoutParams(layoutParams);*/
// 方法3 :通过srcollBy移动父View 的位置,来显示相对的子View 在移动。
((View)getParent()).scrollBy(-offsetX,-offsetY);
// 重置坐标
mLastX = rawX;
mLastY = rawY;
break;
}
return true;
}
}
MainActivity:
package mw.huawei.com.scrollone;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
平滑滑动效果如下: