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

Android仿简书上滑输入框停留效果

2016-12-01 11:52 183 查看
在简书首页上看到的效果  自己研究了一下首先,我们需要自定义一个MyScroViewpublic class MyScrollView extends ScrollView {private OnScrollListener onScrollListener;/*** 主要是用在用户手指离开MyScrollView,MyScrollView还在继续滑动,我们用来保存Y的距离,然后做比较*/private int lastScrollY;public MyScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public void setOnScrollListener(OnScrollListener scrollListener) {this.onScrollListener = scrollListener;}/** 用于用户手指离开MyScrollView的时候获取MyScrollView滚动的Y距离,然后回调给onScroll方法中*/private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);int scrollY = MyScrollView.this.getScrollY();//此时的距离和记录下的距离不相等,在隔5毫秒给handler发送消息if (lastScrollY != scrollY) {lastScrollY = scrollY;handler.sendMessageDelayed(handler.obtainMessage(), 2);}if(onScrollListener != null){onScrollListener.onScroll(scrollY);}}};/*** 重写onTouchEvent, 当用户的手在MyScrollView上面的时候,* 直接将MyScrollView滑动的Y方向距离回调给onScroll方法中,当用户抬起手的时候,* MyScrollView可能还在滑动,所以当用户抬起手我们隔5毫秒给handler发送消息,在handler处理* MyScrollView滑动的距离*/@Overridepublic boolean onTouchEvent(MotionEvent ev) {if(onScrollListener != null){onScrollListener.onScroll(lastScrollY = this.getScrollY());}switch(ev.getAction()){case MotionEvent.ACTION_UP:handler.sendMessageDelayed(handler.obtainMessage(), 20);break;}return super.onTouchEvent(ev);}public interface OnScrollListener {void onScroll(int Y);}}这个很好理解,定义一个滑动监听的回调用来获取用户手指滑动的距离,Handler这个线程一定要加,作用是手指快速滑动的时候能够回调lastScrollY。然后,我们在布局中使用这个MyScroView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<com.text.yanwei.liluotext.MyScrollView
android:id="@+id/myScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<RelativeLayout
android:id="@+id/rlayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" >

<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="顶部信息\n顶部信息\n顶部信息\n顶部信息"
android:textSize="40dp" />
</RelativeLayout>

<LinearLayout
android:id="@+id/search02"
android:layout_width="match_parent"
android:layout_height="40dip"
android:orientation="vertical" >

<EditText
android:id="@+id/search_edit"
android:layout_width="match_parent"
android:layout_height="40dip"
android:hint="请输入..."
android:padding="5dip"
android:singleLine="true"
android:textColorHint="#AAAAAA"
android:textSize="15dip" />
</LinearLayout>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n
测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n
测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n测试内容\n
测试内容\n测试内容\n测试内容\n测试内容"
android:textSize="40dp" />
</LinearLayout>
</com.text.yanwei.liluotext.MyScrollView>

<LinearLayout
android:id="@+id/search01"
android:background="#123456"
android:layout_width="match_parent"
android:layout_height="40dip"
android:orientation="vertical" >
</LinearLayout>

</RelativeLayout>
public class MainActivity extends Activity implements MyScrollView.OnScrollListener {private EditText search_edit;private MyScrollView myScrollView;private int searchLayoutTop;LinearLayout search01, search02;RelativeLayout rlayout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity8391_main);//初始化控件init();}private void init() {search_edit = (EditText) findViewById(R.id.search_edit);myScrollView = (MyScrollView) findViewById(R.id.myScrollView);search01 = (LinearLayout) findViewById(R.id.search01);search02 = (LinearLayout) findViewById(R.id.search02);rlayout = (RelativeLayout) findViewById(R.id.rlayout);myScrollView.setOnScrollListener(this);}@Overridepublic void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);if (hasFocus) {searchLayoutTop = rlayout.getBottom();//获取searchLayout的顶部位置}}//监听滚动Y值变化,通过addView和removeView来实现悬停效果@Overridepublic void onScroll(int scrollY) {if (scrollY >= searchLayoutTop) {if (search_edit.getParent() != search01) {search02.removeView(search_edit);search01.addView(search_edit);}} else {if (search_edit.getParent() != search02) {search01.removeView(search_edit);search02.addView(search_edit);}}}}
最后获取加载EditText布局到屏幕顶端的位置searchLayoutTop,监听OnscrollListener的回调将获取的scrollY与searchLayoutTop相比较,来添加显示EditText
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: