亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

自定義GridView并且實現拖拽(附源碼)

2020-04-11 12:14:30
字體:
來源:轉載
供稿:網友
寫在前面的話
本篇blog實現了GridView的拖拽功能。方法和上一篇自定義ListView實現拖拽ListItem項交換位置一個原理。只是在交換位置上記錄了X軸的相關坐標,計算了X軸的相關變量。

實現效果圖如下
 
說明:
本篇給出實現代碼,但是不做任何說明。如需了解請看上一篇blog:自定義ListView實現拖拽ListItem項交換位置

文件代碼:
1、MainActivity.java
復制代碼 代碼如下:

package com.jay.draggridview;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
public class MainActivity extends Activity {

private static List<String> list = null;
//自定義適配器
private DragGridAdapter adapter = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化數據
initData();

//后面用到的自定義GridView
DragGridView dragGridView = (DragGridView)findViewById(R.id.drag_grid);
adapter = new DragGridAdapter(this, list);
dragGridView.setAdapter(adapter);
}


public void initData(){
list = new ArrayList<String>();
for(int i= 0 ; i < 12 ; i++){
list.add("grid_"+i%12);
}
}



public static class DragGridAdapter extends ArrayAdapter<String>{

public DragGridAdapter(Context context, List<String> objects) {
super(context, 0, objects);
}
public List<String> getList(){
return list;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view==null){
view = LayoutInflater.from(getContext()).inflate(R.layout.drag_grid_item, null);
}
try {
Log.v("item", "------"+getItem(position));
//根據文件名獲取資源文件夾中的圖片資源
Field f= (Field)R.drawable.class.getDeclaredField(getItem(position));
int i=f.getInt(R.drawable.class);
ImageView imageview= (ImageView)view.findViewById(R.id.drag_grid_item_image);
imageview.setImageResource(i);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return view;
}
}
}

2、DragGridView.java
復制代碼 代碼如下:

package com.jay.draggridview;
import com.jay.draggridview.MainActivity.DragGridAdapter;
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.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
public class DragGridView extends GridView{
//定義基本的成員變量
private ImageView dragImageView;
private int dragSrcPosition;
private int dragPosition;
//x,y坐標的計算
private int dragPointX;
private int dragPointY;
private int dragOffsetX;
private int dragOffsetY;
private WindowManager windowManager;
private WindowManager.LayoutParams windowParams;
private int scaledTouchSlop;
private int upScrollBounce;
private int downScrollBounce;


public DragGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}


@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==AdapterView.INVALID_POSITION){
return super.onInterceptTouchEvent(ev);
}

ViewGroup itemView = (ViewGroup) getChildAt(dragPosition-getFirstVisiblePosition());
dragPointX = x - itemView.getLeft();
dragPointY = y - itemView.getTop();
dragOffsetX = (int) (ev.getRawX() - x);
dragOffsetY = (int) (ev.getRawY() - y);

View dragger = itemView.findViewById(R.id.drag_grid_item_drag);
//如果選中拖動圖標
if(dragger!=null&&dragPointX>dragger.getLeft()&&dragPointX<dragger.getRight()&&dragPointY>dragger.getTop()&&dragPointY<dragger.getBottom()+20){

upScrollBounce = Math.min(y-scaledTouchSlop, getHeight()/4);
downScrollBounce = Math.max(y+scaledTouchSlop, getHeight()*3/4);

itemView.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());
startDrag(bm, x, y);
}
return false;
}
return super.onInterceptTouchEvent(ev);
}



@Override
public boolean onTouchEvent(MotionEvent ev) {
if(dragImageView!=null&&dragPosition!=INVALID_POSITION){
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_UP:
int upX = (int)ev.getX();
int upY = (int)ev.getY();
stopDrag();
onDrop(upX,upY);
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int)ev.getX();
int moveY = (int)ev.getY();
onDrag(moveX,moveY);
break;
default:break;
}
return true;
}
return super.onTouchEvent(ev);
}



public void startDrag(Bitmap bm, int x, int y){
stopDrag();

windowParams = new WindowManager.LayoutParams();
windowParams.gravity = Gravity.TOP|Gravity.LEFT;
windowParams.x = x - dragPointX + dragOffsetX;
windowParams.y = y - dragPointY + dragOffsetY;
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 onDrag(int x, int y){
if(dragImageView!=null){
windowParams.alpha = 0.8f;
windowParams.x = x - dragPointX + dragOffsetX;
windowParams.y = y - dragPointY + dragOffsetY;
windowManager.updateViewLayout(dragImageView, windowParams);
}

int tempPosition = pointToPosition(x, y);
if(tempPosition!=INVALID_POSITION){
dragPosition = tempPosition;
}

//滾動
if(y<upScrollBounce||y>downScrollBounce){
//使用setSelection來實現滾動
setSelection(dragPosition);
}
}

public void onDrop(int x, int y){
//為了避免滑動到分割線的時候,返回-1的問題
int tempPosition = pointToPosition(x, y);
if(tempPosition!=INVALID_POSITION){
dragPosition = tempPosition;
}
//超出邊界處理
if(y<getChildAt(0).getTop()){
//超出上邊界
dragPosition = 0;
}else if(y>getChildAt(getChildCount()-1).getBottom()||(y>getChildAt(getChildCount()-1).getTop()&&x>getChildAt(getChildCount()-1).getRight())){
//超出下邊界
dragPosition = getAdapter().getCount()-1;
}
//數據交換
if(dragPosition!=dragSrcPosition&&dragPosition>-1&&dragPosition<getAdapter().getCount()){
DragGridAdapter adapter = (DragGridAdapter)getAdapter();
String dragItem = adapter.getItem(dragSrcPosition);
adapter.remove(dragItem);
adapter.insert(dragItem, dragPosition);
Toast.makeText(getContext(), adapter.getList().toString(), Toast.LENGTH_SHORT).show();
}
}


/***
* 停止拖動,去掉拖動時候的影像
*/
public void stopDrag(){
if(dragImageView != null){
windowManager.removeView(dragImageView);
dragImageView = null;
}
}
}

3、activity_main.xml
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"
android:padding="10dip"
>
<com.jay.draggridview.DragGridView
android:id="@+id/drag_grid"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:numColumns="3"
android:stretchMode="columnWidth"
android:verticalSpacing="5dip"
android:horizontalSpacing="20dip"
android:background="#ffffff"/>
</LinearLayout>

4、drag_grid_item.xml
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dip"
android:paddingRight="5dip">
<ImageView android:id="@+id/drag_grid_item_image"
android:layout_margin="5dip"
android:layout_alignParentTop="true"
android:layout_width="fill_parent"
android:layout_height="60dip"/>
<ImageView android:id="@+id/drag_grid_item_drag"
android:src="@drawable/p32_24_1"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>

源碼下載
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区三区久久| 久久久久久高潮国产精品视| 欧美富婆性猛交| 欧美国产高跟鞋裸体秀xxxhd| 国产精品免费网站| 国产91在线视频| 亚洲一区二区福利| 久久中文字幕在线视频| 亚洲电影在线观看| 国产乱肥老妇国产一区二| 国模gogo一区二区大胆私拍| 色爱av美腿丝袜综合粉嫩av| 欧美理论电影在线播放| 久久伊人91精品综合网站| 中文字幕综合一区| 欧美视频在线免费| 亚洲精品国产综合区久久久久久久| 51精品国产黑色丝袜高跟鞋| 精品国产精品自拍| 欧美成年人视频网站欧美| 国产成人精品综合| 日韩欧美一区二区三区久久| 久久精品这里热有精品| 久久精品国产免费观看| 中文字幕亚洲字幕| 久久频这里精品99香蕉| 亚洲国产一区二区三区四区| 国产成人亚洲综合91精品| 国产乱肥老妇国产一区二| 亚洲视频999| 日韩免费在线播放| 美女黄色丝袜一区| 成人羞羞国产免费| 国产精品爽爽ⅴa在线观看| 亚洲女人天堂网| 国内精品一区二区三区四区| 91网站在线看| 亚洲精品在线视频| 久久久中文字幕| 精品久久久久久| 日韩亚洲欧美中文高清在线| 尤物yw午夜国产精品视频明星| 国产精品老女人精品视频| 欧美成人激情视频免费观看| 国产精品久久久久999| 国产成人精品电影久久久| 欧美日韩在线观看视频| 国内精品久久久久久中文字幕| 91国偷自产一区二区三区的观看方式| 欧美激情一级欧美精品| 国产97色在线|日韩| 欧美激情亚洲精品| 亚洲成年人在线播放| 国产中文字幕日韩| 亚洲欧美日韩国产中文专区| 久久99国产综合精品女同| 一本色道久久88综合日韩精品| 97在线视频免费播放| 亚洲欧美另类人妖| 欧美极品少妇xxxxx| 激情亚洲一区二区三区四区| 亚洲色图激情小说| 久热在线中文字幕色999舞| 日韩中文字幕国产| 成人动漫网站在线观看| 亚洲男人的天堂在线播放| 欧美午夜久久久| 国产精品亚洲аv天堂网| 亚洲第一色在线| 欧美日韩成人在线观看| 宅男66日本亚洲欧美视频| 亚洲国产一区二区三区在线观看| 在线丨暗呦小u女国产精品| 国产久一一精品| 欧美人与性动交| 日韩成人在线视频观看| 69久久夜色精品国产69乱青草| 亚洲石原莉奈一区二区在线观看| 91国产精品视频在线| 亚洲欧洲日产国码av系列天堂| 亚洲精品第一页| 日韩视频免费看| 久久久国产精品一区| 久久精品国产v日韩v亚洲| 国产成人小视频在线观看| 久久免费视频在线观看| 狠狠综合久久av一区二区小说| 亚洲少妇激情视频| 欧美丰满少妇xxxxx做受| 国产一区二区三区直播精品电影| 日韩在线观看av| 97国产一区二区精品久久呦| 欧美黄色片在线观看| 性视频1819p久久| 91久久国产精品91久久性色| 亚洲欧美日韩一区在线| 8090成年在线看片午夜| 97av在线视频| 亚洲爱爱爱爱爱| 91成人性视频| 国产精品高精视频免费| 久久精品久久久久久国产 免费| 欧美天天综合色影久久精品| 色久欧美在线视频观看| 日韩在线视频线视频免费网站| 欧美激情小视频| 久久色免费在线视频| 国产精品日日摸夜夜添夜夜av| 欧美激情在线一区| 日韩精品福利在线| 欧美亚洲国产日本| 欧美性资源免费| 成人www视频在线观看| 欧美裸体xxxx| 欧美大片在线免费观看| 国产欧美日韩高清| 日韩中文理论片| 欧美日韩在线免费观看| 国产一区二区三区在线播放免费观看| 亚洲国产精品国自产拍av秋霞| 日韩av在线网站| 欧美精品做受xxx性少妇| 一区二区成人av| 亚洲午夜精品视频| 久久久亚洲影院| 麻豆国产精品va在线观看不卡| 国产精品aaaa| 欧美日韩国产一区中文午夜| 亚洲欧美综合精品久久成人| 国产精品久久久久久久久粉嫩av| 国产精品久久久久久久久久免费| 国产盗摄xxxx视频xxx69| 欧美高清理论片| 日韩精品久久久久久久玫瑰园| 亚洲自拍在线观看| 久久久久久综合网天天| 国产亚洲精品成人av久久ww| 欧美激情国产高清| 中文欧美日本在线资源| 国产精品专区第二| 亚洲精品乱码久久久久久按摩观| 欧美理论电影在线观看| 欧美精品在线免费播放| 77777少妇光屁股久久一区| 成人日韩av在线| 欧美最猛黑人xxxx黑人猛叫黄| 91国语精品自产拍在线观看性色| 成人黄色网免费| 91久久精品久久国产性色也91| 91国产美女视频| 精品二区三区线观看| 成人h视频在线| 亚洲成年人在线播放| 欧美激情在线有限公司| 日韩av在线高清| 丝袜亚洲另类欧美重口| 精品中文字幕久久久久久| 韩国国内大量揄拍精品视频| 色综合五月天导航| 国产欧美久久一区二区| 俺去啦;欧美日韩| 亚洲精品v欧美精品v日韩精品| 亚洲黄色av网站| 亚洲图片在区色|