編輯:關於Android編程
1. 重新ListView類
package com.whbs.drag.widget;
import com.whbs.drag.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
/*
* 重寫ListView,
*/
public class DragListView extends ListView{
private ImageView dragImageView;//被拖動的影像
private int dragSrcPosition;//拖 動項原始位置
private int dragPosition;//扡動的時候,當前拖動到列表中的位置
private int dragPoint; //在當前數據項中的位置 相對位置
private int dragOffset;//當前視圖和屏幕的距離(這裡是Y方向)絕對位置
private WindowManager windowManager;
private WindowManager.LayoutParams windowParams;
private int scaledTouchSlop=0;//定義拖動的偏差
private int upScrollBounce;//拖動的時候,開始向上滾動 的邊界
private int downScrollBounce;//拖動的時候 ,開始向下滾動 的邊界
public DragListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_DOWN){
int x = (int)ev.getX();
int y = (int)ev.getY();
//根據坐標查找當前數據項位置
dragSrcPosition = dragPosition = pointToPosition(x, y);
if(dragPosition == INVALID_POSITION){
return super.onInterceptTouchEvent(ev);
}
//dragPosition表示當前選 中的位置
//getFirstVisiblePosition()返回第一個display在界面中可見的位置
//dragPosition-getFirstVisiblePosition()表示當前選中的View在可見中的第幾個位置
ViewGroup itemView = (ViewGroup)getChildAt(dragPosition-getFirstVisiblePosition());
dragPoint = y - itemView.getTop();//按下坐標相對itemView的位置,即在itemview中的位置
dragOffset = (int) (ev.getRawY() - y);//當前窗體與屏幕的位置,是一個固定值
//獲取右邊的拖動圖標,
View dragger = itemView.findViewById(R.id.drag_list_item_image);
//如果在右邊位置(拖動圖片右邊的20px的區域)
if(dragger != null && x > dragger.getLeft()-20){
//准備拖動
//初始化拖動的變量
//scaledTouchSlop定入拖動的偏差(一般+-10)
//upScrollBounce當在屏幕的上部(上面1/3區域)或者更上的區域,執行拖動的邊界
upScrollBounce = Math.min(y-scaledTouchSlop, getHeight()/3);
downScrollBounce = Math.max(y+scaledTouchSlop, getHeight()*2/3);
//設置
itemView.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());
startDrag(bm,y);
}
}
return super.onInterceptTouchEvent(ev);
}
//開始拖動
public void startDrag(Bitmap bm,int y){
stopDrag();
windowParams = new WindowManager.LayoutParams();
windowParams.gravity = Gravity.TOP;
windowParams.x = 0;
windowParams.y = y - dragPoint+dragOffset;//計算當前項Top離窗體的距離
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
windowParams.format = PixelFormat.TRANSLUCENT;
windowParams.windowAnimations = 0;
//把影像添加到當彰視圖
ImageView imageView = new ImageView(getContext());
imageView.setImageBitmap(bm);
windowManager = (WindowManager)getContext().getSystemService("window");
windowManager.addView(imageView, windowParams);
dragImageView = imageView;
}
//停止拖動
public void stopDrag(){
if(dragImageView != null){
windowManager.removeView(dragImageView);
dragImageView = null;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(dragImageView != null && dragPosition != INVALID_POSITION ){
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_UP:
int upY = (int)ev.getY();
//釋入扡動影像
stopDrag();
//放下後,判斷位置,實現相應位置刪除和插入
onDrog(upY);
break;
case MotionEvent.ACTION_MOVE:
int moveY = (int)ev.getY();
onDrag(moveY);
break;
}
return true;
}
return super.onTouchEvent(ev);
}
//拖動中
public void onDrag(int y){
if(dragImageView != null){
windowParams.alpha = 0.8f;
windowParams.y = y - dragPoint + dragOffset;
windowManager.updateViewLayout(dragImageView, windowParams);
}
//為了避免滑動到分割線
int tempPosition = pointToPosition(0, y);
if(tempPosition != INVALID_POSITION){
dragPosition = tempPosition;
}
//滾動
int scrollheight = 0;
if(y < upScrollBounce){
scrollheight = 8;//定義向上滾動8個像表
}else if(y > downScrollBounce){
scrollheight = -8;//定義向下滾動8個像表
}
if(scrollheight !=0){//滾動ListView
setSelectionFromTop(dragPosition, getChildAt(dragPosition-getFirstVisiblePosition()).getTop()+scrollheight);
// System.out.println("setSelectionFromTop y="+getChildAt(dragPosition-getFirstVisiblePosition()).getTop());
}
}
//拖動結束放下影像,更新位置
public void onDrog(int y ){
int tempPosition = pointToPosition(0, y);
if(tempPosition != INVALID_POSITION){
dragPosition = tempPosition;
}
//超出邊界處理
if(y < getChildAt(0).getTop()){
dragPosition = 0;
}else if(y > getChildAt(getChildCount()-1).getBottom()){
dragPosition = getAdapter().getCount() -1;
}
//數據更新
if(dragPosition >= 0 && dragPosition < getAdapter().getCount()){
ArrayAdapter<String> adapter = (ArrayAdapter<String>)getAdapter();
String dragItem = adapter.getItem(dragSrcPosition);
//刪除 原位置數據項
adapter.remove(dragItem);
adapter.insert(dragItem, dragPosition);
}
}
}
本文是以源碼中development/tools/idegen/README作為指導文檔.環境: Ubuntu 14.10,openJdk 1.7,Android Stu
下拉刷新上拉加載更多的擴展ListView在很多APP我們都能看到,在一個列表上面,將手指往屏幕下面滑動,列表上方就會出現一個隱藏的View,一般寫有“下拉刷
前言谷歌對UI測試(UI Tetsting)的概念是:確保用戶在一系列操作過程中(例如鍵盤輸入、點擊菜單、彈出對話框、圖像顯示以及其他UI控件的改變),你的應用程序做出正
一、基礎知識1.Android 進程優先級1.1 進程優先級等級一般分法:- Activte process- Visible Process- Service proc