android滑動監聽
❶ android : 如何實現移動進入一個view的監聽事件
(1)綁定Adapter,需要判定View組件的子Item,分別注冊AdapterView.onItemclickListener不就可以了,裡面的參數回調可以區分點擊的是那一個子Item;
(2)如果不需要區分子Item,給這兩個View組件分別注冊View.onClickListener就可以了;或者讓Activity實現View.onClickListener介面,在給這兩個View組件注冊監聽,然後在onClick方法里寫個switch語句,就可以按照case R.id.xxx 這樣做想做的處理了。
❷ android recyclerview滑動監聽滑過多少條
1.利用OnScrollListener[java]viewplainmRecyclerView.addOnScrollListener(newRecyclerView.OnScrollListener(){privateinttotalDy=0;@OverridepublicvoidonScrolled(RecyclerViewrecyclerView,intdx,intdy){totalDy-=dy;}});如代碼所述,totalDy的確保存了RecyclerView的滑動距離,但是當我向下滑動RecyclerView,之後插入/刪除/移動Item的時候,totalDy就變得不精確了;比如刪除或者插入新的Item,那麼totalDy就不能再回歸到0了。解決法:監聽RecyclerView的addOnScrollListener後自己記錄onScrolled的dy,同時給adapter加個registerAdapterDataObserver,監聽插入/刪除/移動,自己加減前面記錄的dy滾動值。自己沒有試過,不知道是否可行!2.有人說可以嘗試computeVerticalScrollOffset()[java]viewplaintotalDy=recyclerView.computeVerticalScrollOffset();然而compute方法計算出的並不是滑動的精確距離,stackOverflow上有答案解釋其為item的平均高度*可見item數目,不是我們需要的精確距離。3.還有人說可以嘗試getChildAt(0)[java]viewplaintotalDy=recyclerView.getChildAt(0).getTop();依靠第一個item的滑動距離來進行動畫的設置,但是根據該方法得出的totalDy在滑動到一定程度後清零。這是因為recyclerViewl.getChildAt(0)返回的永遠是第一個可見的child,不是所有viewlist的第一個child,因此這種用法是得不到滑動距離的。另外下面這三種用法都是等價的,都是獲取第一個可見的child:[java]=(LinearLayoutManager)this.getLayoutManager();ViewfirstVisiableChildView=this.getChildAt(0);ViewfirstVisiableChildView=layoutManager.getChildAt(0)intposition=layoutManager.findFirstVisibleItemPosition();ViewfirstVisiableChildView=layoutManager.getChildAt(position)但是下面這種就不是獲取第一個可見的child,而是獲得所有viewlist的第一個child。但是滑動一段距離後它總是返回null,即第一個child被recycle後,總是返回null。[java]viewplain//Don',.=(LinearLayoutManager)this.getLayoutManager();Viewchild2=layoutManager.findViewByPosition(0);4.如果LayoutManager用的是LinearLayoutManager,強烈推薦下面的方法獲取滑動距離:[java](){=(LinearLayoutManager)this.getLayoutManager();intposition=layoutManager.findFirstVisibleItemPosition();ViewfirstVisiableChildView=layoutManager.findViewByPosition(position);intitemHeight=firstVisiableChildView.getHeight();return(position)*itemHeight-firstVisiableChildView.getTop();}
❸ android adapterview怎麼監聽滑動到底部
main.xml如下:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
/>
</RelativeLayout>
listviewitem.mxl如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView"
android:layout_width="fill_parent"
android:gravity="center"
android:layout_height="80dip"
/>
</RelativeLayout>
MainActivity如下:
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
private ListView mListView;
private SimpleAdapter mSimpleAdapter;
private HashMap<String, Object> mHashMap;
private ArrayList<HashMap<String, Object>> mArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
mListView=(ListView) findViewById(R.id.listView);
mArrayList=new ArrayList<HashMap<String,Object>>();
addDataForListView();
mSimpleAdapter=new SimpleAdapter
(MainActivity.this, mArrayList, R.layout.listviewitem, new String []{"id"},new int []{R.id.textView});
mListView.setAdapter(mSimpleAdapter);
mListView.setOnScrollListener(new OnScrollListenerImple());
}
private void addDataForListView(){
System.out.println("====>Add data to ListView");
for (int i = 0; i < 10; i++) {
mHashMap=new HashMap<String, Object>();
mHashMap.put("id", ""+i);
mArrayList.add(mHashMap);
}
}
private class OnScrollListenerImple implements OnScrollListener{
@Override
public void onScroll(AbsListView listView, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
int lastItem = firstVisibleItem + visibleItemCount;
if(lastItem == totalItemCount) {
System.out.println("Scroll to the listview last item");
View lastItemView=(View) listView.getChildAt(listView.getChildCount()-1);
if ((listView.getBottom())==lastItemView.getBottom()) {
System.out.println("========Scroll to the listview bottom =============");
addDataForListView();
mSimpleAdapter.notifyDataSetChanged();
}
}
}
@Override
public void onScrollStateChanged(AbsListView listview, int scrollState) {
}
}
}
❹ android如何實現屏幕指定區域監聽手勢劃動事件
有個小技巧,就是用linearLayout.左邊一個,右邊一個。分別監聽兩個linearLayout即使左右監聽。而且不用擔心左邊偏移等問題。希望能幫到你。
❺ android fragment怎麼監聽上下滑動
在Android應用中,經常需要手勢滑動操作,比如上下滑動,或左右方向滑動,處理手勢滑動 。通常有兩種方法:一種是單獨實現setOnTouchListener監聽器來,另一種是構建手勢探測器
第一種方法,就是在要實現滑動的View中,實現OnTouchListener監聽事件,然後判斷KeyDonw和KeyUp 直接的位置距離來判斷滑動方向,核心實現代碼如下:
/**
* 設置上下滑動作監聽器
* @author jczmdeveloper
*/
private void setGestureListener(){
myView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPosX = event.getX();
mPosY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurPosX = event.getX();
mCurPosY = event.getY();
break;
case MotionEvent.ACTION_UP:
if (mCurPosY - mPosY > 0
&& (Math.abs(mCurPosY - mPosY) > 25)) {
//向下滑動
} else if (mCurPosY - mPosY < 0
&& (Math.abs(mCurPosY - mPosY) > 25)) {
//向上滑動
collapse();
}
break;
}
return true;
}
});
}
第二種方法:就是構建手勢探測器,如GestureDetector mygesture = new GestureDetector(this);,然後在onFling方法中根據MotionEvent的兩個參數的 按下和滑動以及放開的位置和距離來判斷滑動方向以及滑動速度等的。要構建GestureDetector,必須要和OnTouchListener一起使用,因為必須設置Touch監聽,核心實現實例如下:
import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
public class TagScrollView extends FrameLayout implements OnTouchListener, OnGestureListener{
private float mPosX, mPosY, mCurPosX, mCurPosY;
private static final int FLING_MIN_DISTANCE = 20;// 移動最小距離
private static final int FLING_MIN_VELOCITY = 200;// 移動最大速度
//構建手勢探測器
GestureDetector mygesture = new GestureDetector(this);
public TagScrollView(Context context) {
this(context, null);
}
public TagScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TagScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
//setGestureListener();
//設置Touch監聽
this.setOnTouchListener(this);
//允許長按
this.setLongClickable(true);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return mygesture.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
// e1:第1個ACTION_DOWN MotionEvent
// e2:最後一個ACTION_MOVE MotionEvent
// velocityX:X軸上的移動速度(像素/秒)
// velocityY:Y軸上的移動速度(像素/秒)
// X軸的坐標位移大於FLING_MIN_DISTANCE,且移動速度大於FLING_MIN_VELOCITY個像素/秒
//向
if (e1.getY() - e2.getY() > FLING_MIN_DISTANCE){
// && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
collapse();
}
//向上
if (e2.getY() - e1.getY() > FLING_MIN_DISTANCE
&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {
}
return false;
}
}
❻ android 怎樣監聽scrollview滑動到底部
public class MyScrollView extends HorizontalScrollView {
//復寫overScrollBy方法
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
//注意deltaX的值和isTouchEvent的值,deltaX可以認為是X軸變化的速度,isTouchEvent意思是移動事件是否來自手勢。經過多次確認,當deltaX的值為1,2或-1,-2,以及isTouchEvent值為false的時候,scrollView的移動趨於停止
System.out.println(deltaX+" "+scrollX+" "+scrollRangeX+" "+maxOverScrollX+" "+isTouchEvent);
if(deltaX<=2&&deltaX>=-2&&!isTouchEvent){
//scrollView停止移動了
}
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
}
}
❼ android 怎麼監聽scrollview的滾動
在Scrollview裡面添加了listview,注意由於兩這會有滾動條的沖突,因此listview一定要自已復寫,
代碼有真相:
public class CompleteListView extends ListView {
public CompleteListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CompleteListView(Context context) {
super(context);
}
public CompleteListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
注意onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法是解決沖突的方法。
項目需求是當scrollview滾動到最底端時listview進行載入更多。
判斷方法在,
該類需要implents OnTouchListener
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
index++;
break;
default:
break;
}
if(event.getAction()==MotionEvent.ACTION_UP && index > 0){
index=0;
mLastY = scrollView.getScrollY();//賦值給mLastY
//alllinear是scrollview里包括的那個linearlayout布局
[java] view plain
if(mLastY == (alllinear.getHeight()-scrollView.getHeight())){
//TODO
//滑動到底部,你要做的事
[java] view plain
}
return false;
不好意思,有幾個步驟很重要不加的話你會發現沒有效果的:
1:定義Scrollview scrollview,
2:為了優化滑動監聽加一個成員變數:int index;
3:findviewById不必說,
4:scrollView.setOnTouchListener(this);//很重要··················
❽ 如何監聽android的屏幕滑動停止事件
android的屏幕滑動停止事件監聽方法為:
1、自定義一個ScrollView,內容只要將標準的ScrollView 拷貝出來,然後就可以利用Scroller的兩個屬性去判斷是否滾動完畢:
public final boolean isFinished() {
return mFinished;
}
public final int getDuration() {
return mDuration;
}
2、啟動線程來獲得當前的scrollview的高度,並實時更新就可以了,一旦高度不再發生變化則判斷為停止。
❾ 安卓開發怎樣監聽viewpager的滑動變化
android ViewPager滑動事件講解
今天在做項目的時候,由於要處理viewPager頁面滑動的事件,所以對其進行了一個小小的研究:
首先ViewPager在處理滑動事件的時候要用到OnPageChangeListener
OnPageChangeListener這個介面需要實現三個方法:(onPageScrollStateChanged,onPageScrolled ,onPageSelected)
onPageScrollStateChanged(int arg0) ,此方法是在狀態改變的時候調用,其中arg0這個參數
有三種狀態(0,1,2)。arg0 ==1的時辰默示正在滑動,arg0==2的時辰默示滑動完畢了,arg0==0的時辰默示什麼都沒做。
當頁面開始滑動的時候,三種狀態的變化順序為(1,2,0),演示如下:
當viewPager狀態改變時候的代碼塊:
<IMG style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: medium none; BORDER-RIGHT: medium none" alt=http://img.my.csdn.net/uploads/201304/16/1366083605_9502.png src="http://img.my.csdn.net/uploads/201304/16/1366083605_9502.png">
列印結果:
<IMG style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: medium none; BORDER-RIGHT: medium none" alt=http://img.my.csdn.net/uploads/201304/16/1366083785_1088.png src="http://img.my.csdn.net/uploads/201304/16/1366083785_1088.png">
onPageScrolled(int arg0,float arg1,int arg2) ,當頁面在滑動的時候會調用此方法,在滑動被停止之前,此方法回一直得到
調用。其中三個參數的含義分別為:
arg0 :當前頁面,及你點擊滑動的頁面
arg1:當前頁面偏移的百分比
arg2:當前頁面偏移的像素位置
(參見官網:http://docs.eoeandroid.com/reference/android/support/v4/view /ViewPager.OnPageChangeListener.html#onPageScrolled(int, float, int))
演示如下:
頁面滾動時侯代碼:
<IMG style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: medium none; BORDER-RIGHT: medium none" alt=http://img.my.csdn.net/uploads/201304/16/1366084226_5095.png src="http://img.my.csdn.net/uploads/201304/16/1366084226_5095.png">
日誌列印:
<IMG style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: medium none; BORDER-RIGHT: medium none" alt=http://img.my.csdn.net/uploads/201304/16/1366084267_6134.png src="http://img.my.csdn.net/uploads/201304/16/1366084267_6134.png">
onPageSelected(int arg0) : 此方法是頁面跳轉完後得到調用,arg0是你當前選中的頁面的Position(位置編號)
❿ android scrollview 怎麼監聽滑動方向
/**
* 可以監聽ScrollView的上下滑動 ,實現ScrollListener介面,調用setScrollListener(ScrollListener l)方法。
* SCROLL_UP :ScrollView正在向上滑動
* SCROLL_DOWN :ScrollView正在向下滑動
* @author xm
*/
public class ObservableScrollView extends ScrollView {
private ScrollListener mListener;
public static interface ScrollListener {
public void scrollOritention(int oritention);
}
/**
* ScrollView正在向上滑動
*/
public static final int SCROLL_UP = 0x01;
/**
* ScrollView正在向下滑動
*/
public static final int SCROLL_DOWN = 0x10;
/**
* 最小的滑動距離
*/
private static final int SCROLLLIMIT = 40;
public ObservableScrollView(Context context) {
super(context, null);
}
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
}
public ObservableScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (oldt > t && oldt - t > SCROLLLIMIT) {// 向下
if (mListener != null)
mListener.scrollOritention(SCROLL_DOWN);
} else if (oldt < t && t - oldt > SCROLLLIMIT) {// 向上
if (mListener != null)
mListener.scrollOritention(SCROLL_UP);
}
}
public void setScrollListener(ScrollListener l) {
this.mListener = l;
}
}