編輯:關於Android編程
MainActivity如下:
package cc.testscroller2;
import android.os.Bundle;
import android.app.Activity;
/**
* Demo描述:
* 實現可以拉動後回彈的布局.
* 類似於下拉刷新的.
*
* 參考資料:
* 1 http://gundumw100.iteye.com/blog/1884373
* 2 http://blog.csdn.net/gemmem/article/details/7321910
* 3 http://ipjmc.iteye.com/blog/1615828
* 4 http://blog.csdn.net/c_weibin/article/details/7438323
* 5 http://www.cnblogs.com/wanqieddy/archive/2012/05/05/2484534.html
* 6 http://blog.csdn.net/hudashi/article/details/7353075
* Thank you very much
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
package cc.testscroller2;
import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import android.widget.Scroller;
/**
* 總體思路:
* 處理View的Touch事件,即重寫onTouchEvent()方法:
* 當手指抬起時將其回到原點,其余情況交給GestureDetector處理.
*
* 在GestureDetector中重點是覆寫onScroll()方法.在該方法中得到
* Y方向滑動的距離,從而設置 mScroller.startScroll()方法,准備滑動.
* 隨之刷新界面invalidate()從而執行方法computeScroll().
* 在computeScroll()方法中調用 scrollTo()方法實現真正的滑動.
*
* 注意事項:
* 1 scrollTo()方法的參數:
* scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
* 並且在此之後也要調用postInvalidate()進行刷新
*
*
* 方法說明:
* 1 mScroller.getFinalX(Y)()
* The final X(Y) offset as an absolute distance from the origin.
* 返回滾動結束位置(得到當前X(Y)距離原始位置的值).僅針對"fling"滾動有效.
* 也就是說該方法是針對滾動結束而言的.
*
* 坐標方向:
* X方向的距離,正數向左,負數向右
* Y方向的距離,正數向上,負數向下
*
* 2 mScroller.getCurrX(Y)()
* The new X offset as an absolute distance from the origin.
* The new Y offset as an absolute distance from the origin.
* 返回當前滾動 X(Y)方向的偏移
* 也就是說該方法是針對滾動中而言的.
*
* 坐標方向:
* X方向的距離,正數向左,負數向右
* Y方向的距離,正數向上,負數向下
*
* 3 invalidate()與postInvalidate()的區別
* invalidate()在UI線程自身中使用;postInvalidate()在非UI線程中使用.
* 這是目前網絡資料的普遍說法,還待進一步研究.
*
* 4 startScroll(int startX, int startY, int dx, int dy, int duration)
* 第一,二個參數起始位置;第三,四個滾動的偏移量;第五個參數持續時間
*
*
*/
public class BounceableLinearLayout extends LinearLayout {
private Scroller mScroller;
private GestureDetector mGestureDetector;
public BounceableLinearLayout(Context context) {
this(context, null);
}
public BounceableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
setClickable(true);
setLongClickable(true);
mScroller = new Scroller(context);
mGestureDetector = new GestureDetector(context, new GestureListenerImpl());
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
System.out.println("computeScroll()---> "+
"mScroller.getCurrX()="+mScroller.getCurrX()+","+
"mScroller.getCurrY()="+mScroller.getCurrY());
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
//必須執行postInvalidate()從而調用computeScroll()
//其實,在此調用invalidate();亦可
postInvalidate();
}
super.computeScroll();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP :
//手指抬起時回到最初位置
prepareScroll(0, 0);
break;
default:
//其余情況交給GestureDetector手勢處理
return mGestureDetector.onTouchEvent(event);
}
return super.onTouchEvent(event);
}
class GestureListenerImpl implements GestureDetector.OnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
//控制拉動幅度:
//int disY=(int)((distanceY - 0.5)/2);
//亦可直接調用:
//smoothScrollBy(0, (int)distanceY);
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {
int disY = (int) ((distanceY - 0.5) / 2);
beginScroll(0, disY);
return false;
}
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
return false;
}
}
//滾動到目標位置
protected void prepareScroll(int fx, int fy) {
int dx = fx - mScroller.getFinalX();
int dy = fy - mScroller.getFinalY();
beginScroll(dx, dy);
}
//設置滾動的相對偏移
protected void beginScroll(int dx, int dy) {
System.out.println("smoothScrollBy()---> dx="+dx+",dy="+dy);
//第一,二個參數起始位置;第三,四個滾動的偏移量
mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);
System.out.println("smoothScrollBy()---> " +
"mScroller.getFinalX()="+mScroller.getFinalX()+","+
"mScroller.getFinalY()="+mScroller.getFinalY());
//必須執行invalidate()從而調用computeScroll()
invalidate();
}
}
Android UI(SeekBar)詳解
目錄:1.SeekBar的應用場景2.SeekBar的簡單使用與事件監聽3.圖片資源自定義SeekBar+手機音量調節4.xml繪制自定義SeekBar1.SeekBar
優步電話加密服務什麼時候上線 隱號通話方案如何
優步(UBER)-全球即時用車軟件,現已覆蓋全球68個國家,444個城市。Uber旨在為大家帶來更安全、更舒適的出行方式,為了保證雙方的安全和隱私,優步(U
Android網絡分析和優化
目前針對公司Android端的SDK進行實際測試,反映出存在網絡加載資源緩慢的問題,在知曉目前CDN的可能存在不穩定的情況下,針對sdk本身的網絡模塊進行了相應的分析,整
Android群英傳筆記——第七章:Android動畫機制和使用技巧
Android動畫效果一直是人家中十分重要的一部分,從早期的Android版本中,由於動畫機制和繪圖機制的不健全,Android的人機交互備受诟病,Android從4.X