Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android ListView拖到效果實現代碼

Android ListView拖到效果實現代碼

編輯:關於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);

}

}

}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved