android滑動距離
⑴ android verticalviewpager 怎麼控制滑動翻頁距離
下面的代碼片段詳細說明了如何實現滑動翻頁。
復制代碼 代碼如下:
public class ViewFlipperActivity extends Activity implements OnGestureListener {
private static final int FLING_MIN_DISTANCE = 100;
private ViewFlipper flipper;
private GestureDetector detector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewflipper);
// 注冊一個GestureDetector
detector = new GestureDetector(this);
flipper = (ViewFlipper) findViewById(R.id.ViewFlipper);
ImageView image1 = new ImageView(this);
image1.setBackgroundResource(R.drawable.image1);
// 增加第一個view
flipper.addView(image1);
ImageView image2 = new ImageView(this);
image2.setBackgroundResource(R.drawable.image2);
// 增加第二個view
flipper.addView(image2);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 將觸屏事件交給手勢識別類處理
return this.detector.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE) {
//設置View進入和退出的動畫效果
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.left_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.left_out));
this.flipper.showNext();
return true;
}
if (e1.getX() - e2.getX() < -FLING_MIN_DISTANCE) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.right_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.right_out));
this.flipper.showPrevious();
return true;
}
return false;
}
}
在這段代碼里,創建了兩個IamgeView(用來顯示圖片),加入到了ViewFlipper中。程序運行後,當用手指在屏幕上向左滑動,會顯示前一個圖片,用手指在屏幕上向右滑動,會顯示下一個圖片。實現滑動切換的主要代碼都在onFling()方法中,用戶按下觸摸屏,快速移動後松開,就會觸發這個事件。在這段代碼示例中,對手指滑動的距離進行了計算,如果滑動距離大於100像素,就做切換動作,否則不做任何切換動作。
⑵ Android上這種布局和聯動的滑動效果是怎麼做到的
實現思路簡介:viewpager是全屏的,所有頁面共用的header,根據當前頁面listview或者scrollview的滑動距離設置translationY;切換tab時,根據當前header的高度調整下一個tab頁面的滾動距離。缺點:封面上有很多響應時,需要自己進行手勢處理
給點提示:
MainActivity文件中代碼:
package com.android.flip;
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;
/**
* Android實現左右滑動效果
* @Description: Android實現左右滑動效果
* @File: MainActivity.java
* @Package com.android.flip
* @Author Hanyonglu
* @Date 2012-02-12 上午10:44:04
* @Version V1.0
*/
public class MainActivity extends Activity implements OnGestureListener {
private ViewFlipper flipper;
private GestureDetector detector;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this);
flipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper1);
flipper.addView(addImageView(R.drawable.one));
flipper.addView(addImageView(R.drawable.two));
flipper.addView(addImageView(R.drawable.three));
flipper.addView(addImageView(R.drawable.four));
flipper.addView(addImageView(R.drawable.five));
}
private View addImageView(int id) {
ImageView iv = new ImageView(this);
iv.setImageResource(id);
return iv;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return this.detector.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() - e2.getX() > 120) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
this.flipper.showNext();
return true;
} else if (e1.getX() - e2.getX() < -120) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
this.flipper.showPrevious();
return true;
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// 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;
}
}
⑶ 如何獲取 RecyclerView 的滑動距離
1、有兩種方法:
(1)代碼法:
switch (action) {
case MotionEvent.ACTION_DOWN:
DownX = event.getX();//float DownX
DownY = event.getY();//float DownY
currentMS = System.currentTimeMillis();//long currentMS 獲取系統時間
break;
case MotionEvent.ACTION_MOVE:
float moveX = event.getX() - DownX;//X軸距離
float moveY = event.getY() - DownY;//y軸距離
long moveTime = System.currentTimeMillis() - currentMS搜索;//移動時間
break;
case MotionEvent.ACTION_UP:
break;}
(2)坐標法:
滑動其實只是不停的重繪圖像,造成滑動的效果。
滑動其實是處理手的觸屏事件,在View里有onTouch事件,裡面會MotionEvent對象,裡面保存當前手的位置坐標,根據這個坐標計算手滑動的距離,一般是在收到ACTION_DOWN時保存按下的位置,然後ACTION_MOVE會不停的上報,計算得出滑動距離。
2、RecyclerView簡介:
RecyclerView是v7的一個新控制項。在v7.21+包中,是一個用來展示大量數據的組件,或者說,就是ListView的改善版本。RecyclerView本質上是以適配器為核心。緩存viewHolder,view包含在viewHolder內。自推出以來廣受Android程序愛好者的推崇,然而不得不說這個控制項存在著一個比較嚴重的問題,就是滑動的時候會有不可容忍的卡頓現象出現。
3、RecyclerView卡頓現象解決方法:
將耗時的操作放到recyclerview.setAdapter(adapter)之前運行,運行完後再將需要的參數傳入Adapter里,此處重寫一個adapter類繼承Adapter就可以了。解決後運行,滑動恢復了流暢。