在百度新聞和網易新聞app裏看到了自定義欄目的效果,它們都採用了拖動控件的方式來定製屬於自己的欄目。想了會,沒思路,google了一把
在android中,拖放控件的原理大致如下:重寫某控件(比如TextView)的onTouchEvent方法,監聽其MotionEvent的事件(一般就是按下、移動、釋放等),在其中記錄移動該控件的實時座標並設置爲當前座標即可。
更具有借鑑性的實際例子:
1、Google Code有個開源的項目android-drag-and-drop-listview,裏面有個不錯的例子。
2、博客園謙虛的天下寫了一篇很讚的博文,該博文借鑑了apidemo裏面的music例子,加上了對listview分組後的拖拉考慮,還加上了拖影效果,註釋詳盡,在此感謝。
下面是一個拖動TextView的簡單例子的關鍵代碼,完整工程見這裏。
@Override
public boolean onTouchEvent(MotionEvent event) {
final int iAction = event.getAction();
final int iCurrentx = (int)event.getX();
final int iCurrenty = (int)event.getY();
switch(iAction)
{
case MotionEvent.ACTION_DOWN:
mPreviousx = iCurrentx;
mPreviousy = iCurrenty;
break;
case MotionEvent.ACTION_MOVE:
int iDeltx = iCurrentx - mPreviousx;
int iDelty = iCurrenty - mPreviousy;
final int iLeft = getLeft();
final int iTop = getTop();
if(iDeltx != 0 || iDelty != 0)
layout(iLeft + iDeltx,
iTop + iDelty,
iLeft + iDeltx + getWidth(),
iTop + iDelty + getHeight());
mPreviousx = iCurrentx - iDeltx;
mPreviousy = iCurrenty - iDelty;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}