跨界面拖动图标所遇到的问题

And乔 2015-07-29 02:09:38

本人小白
要实现界面上图标的拖动,并且能够添加其他界面上的的图标

思路是这样的:首先将图标拖动功能实现(在网上找的人家的demo稍作修改即实现),然后在主界面中加入一个抽屉的布局,抽屉中用一个gridview添加一些图标(可实现item之间的拖动与交换),现在遇到的问题是我想将抽屉之中的图标(即抽屉中gridview上的item拖动加入到主界面中的gridview中),想在拖动的时候增加一判断当该图标拖动超过抽屉范围后,调用一函数,该函数可以在主界面中增加一个view,并将信息传递给该view,然后将抽屉中的view删除掉,目前我已将这个函数写好,但是现在运行程序图标的跨界面拖动,并且只要一将图标拖出抽屉范围,就直接崩溃

求大神们指点一二。。。。
...全文
262 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
YXTS122 2018-09-22
  • 打赏
  • 举报
回复
我也不知道怎么跨界面拖动图片呀!!!!!!!!!!
coleAI 2018-09-21
  • 打赏
  • 举报
回复
完全不知道怎么夸界面拖动图片
And乔 2015-07-31
  • 打赏
  • 举报
回复
问题已基本解决,多谢各位帮助
And乔 2015-07-31
  • 打赏
  • 举报
回复
拖动的类

package com.example.choutituodong;



import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Vibrator;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;



public class mydragview  extends GridView{

	private long dragResponseMS = 500;
	
	
	private boolean isDrag = false;
	private int mDownX;
	private int mDownY;
	private int moveX;
	private int moveY;

	public int mDragPosition;
	private View mStartDragItemView = null;	
	private ImageView mDragImageView;
	private Vibrator mVibrator;
	
	private WindowManager mWindowManager;
	private WindowManager.LayoutParams mWindowLayoutParams;
	private Bitmap mDragBitmap;
	private int mPoint2ItemTop ; 
	private int mPoint2ItemLeft;
	private int mOffset2Top;
	private int mOffset2Left;
	private int mStatusHeight; 

	
	private OnChanageListener onChanageListener;
	
		public mydragview(Context context) {
		this(context, null);
	}
	
	public mydragview(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public mydragview(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
		mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		mStatusHeight = getStatusHeight(context); //
	}
	
	private Handler mHandler = new Handler();
	//判断是否为长按某键,产生震动效果,隐藏当前item,调用生成imageview函数×
	private Runnable mLongClickRunnable = new Runnable() {	
		@Override
		public void run() {
			isDrag = true; //���ÿ����ק
//			mVibrator.vibrate(50); 
			mStartDragItemView.setVisibility(View.INVISIBLE);//���ظ�item
			
			createDragImage(mDragBitmap, mDownX, mDownY);
		}
	};
	
	public void setOnChangeListener(OnChanageListener onChanageListener){
		this.onChanageListener = onChanageListener;
	}
	//按的时间超过1000毫秒则产生回应
	public void setDragResponseMS(long dragResponseMS) {
		this.dragResponseMS = dragResponseMS;
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		switch(ev.getAction()){
		case MotionEvent.ACTION_DOWN:

//判断是否为长嗯,即是否满足回应时间
			mHandler.postDelayed(mLongClickRunnable, dragResponseMS);
			
			mDownX = (int) ev.getX();
			mDownY = (int) ev.getY();
	//获取当前按住的item位置	
			mDragPosition = pointToPosition(mDownX, mDownY);

			
			if(mDragPosition == AdapterView.INVALID_POSITION){
				return super.dispatchTouchEvent(ev);
			}
			
		
			mStartDragItemView = getChildAt(mDragPosition - getFirstVisiblePosition());
//获取手指距离item边缘的位置	
			mPoint2ItemTop = mDownY - mStartDragItemView.getTop();
			mPoint2ItemLeft = mDownX - mStartDragItemView.getLeft();
//获取gridview距离屏幕边缘的位置
			mOffset2Top = (int) (ev.getRawY() - mDownY);
			mOffset2Left = (int) (ev.getRawX() - mDownX);
			

			
//开启绘图缓存
			mStartDragItemView.setDrawingCacheEnabled(true);
			mDragBitmap = Bitmap.createBitmap(mStartDragItemView.getDrawingCache());
			mStartDragItemView.destroyDrawingCache();
				
			break;
		case MotionEvent.ACTION_MOVE:
//获取移动位置
			int moveX = (int)ev.getX();
			int moveY = (int) ev.getY();
//如果手指位置一直没有移出item边界则视为一直按住该图标	
			if(!isTouchInItem(mStartDragItemView, moveX, moveY)){
				mHandler.removeCallbacks(mLongClickRunnable);
			}
			break;
		case MotionEvent.ACTION_UP:
//手指离开屏幕,长按事件结束
			mHandler.removeCallbacks(mLongClickRunnable);

			break;
		}
		return super.dispatchTouchEvent(ev);
	}
//判断手指位置是否在该item内
	private boolean isTouchInItem(View dragView, int x, int y){
	//获取item距离gridview边缘距离
		int leftOffset = dragView.getLeft();
		int topOffset = dragView.getTop();
		if(x < leftOffset || x > leftOffset + dragView.getWidth()){
			return false;
		}
		
		if(y < topOffset || y > topOffset + dragView.getHeight()){
			return false;
		}
//如果现在手指位置在item内则返回true
		return true;
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
//判断是否满足拖拽的条件
		if(isDrag && mDragImageView != null){
			switch(ev.getAction()){
			case MotionEvent.ACTION_MOVE:
				moveX = (int) ev.getX();
				moveY = (int) ev.getY();

//获取现在手指位置调用ondragitem函数,即移动函数
				onDragItem(moveX, moveY);
				break;
			case MotionEvent.ACTION_UP:
//手指离开屏幕,调用函数删除生成镜像,并将拖拽条件置为否
				onStopDrag();
				isDrag = false;
				break;
			}
			return true;
		}


		return super.onTouchEvent(ev);  
	}
	
	//生成该item的可以拖动的image镜像,downX,downy为相对于父控件的位置
	private void createDragImage(Bitmap bitmap, int downX , int downY){
		mWindowLayoutParams = new WindowManager.LayoutParams();
		mWindowLayoutParams.format = PixelFormat.TRANSLUCENT; 
		mWindowLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
		mWindowLayoutParams.x = downX - mPoint2ItemLeft + mOffset2Left;
		mWindowLayoutParams.y = downY - mPoint2ItemTop + mOffset2Top - mStatusHeight;
		mWindowLayoutParams.alpha = 0.55f; 
		mWindowLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;  
		mWindowLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;  
		mWindowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE ;	  
		mDragImageView = new ImageView(getContext());  
		mDragImageView.setImageBitmap(bitmap);  
		mWindowManager.addView(mDragImageView, mWindowLayoutParams);  
	}

	//如果该imageview还存在则将该image移除,并将其标志位置为空
	private void removeDragImage(){
		if(mDragImageView != null){
			mWindowManager.removeView(mDragImageView);
			mDragImageView = null;
		}
	}
	

	private void onDragItem(int moveX, int moveY){
//计算手指位置相对于屏幕的距离,更新imageview的位置
		mWindowLayoutParams.x = moveX - mPoint2ItemLeft + mOffset2Left;
		mWindowLayoutParams.y = moveY - mPoint2ItemTop + mOffset2Top - mStatusHeight;

		
		
		if(mWindowLayoutParams.y<400){
		
			onChanageListener.addview(mDragPosition);
			mWindowManager.updateViewLayout(mDragImageView, mWindowLayoutParams); 
		}
	else{
//调用itemswap函数
		mWindowManager.updateViewLayout(mDragImageView, mWindowLayoutParams); 
		onSwapItem(moveX, moveY);
		}
	}
	
	


	private void onSwapItem(int moveX, int moveY){

		int tempPosition = pointToPosition(moveX, moveY);
//如果手指移动超过item范围(即不是初始item)则将当前位置item隐藏,并显示初始item在当前位置
		if(tempPosition != mDragPosition && tempPosition != AdapterView.INVALID_POSITION){
			getChildAt(tempPosition - getFirstVisiblePosition()).setVisibility(View.INVISIBLE);//将image拖动到当前位置的item隐藏
			getChildAt(mDragPosition - getFirstVisiblePosition()).setVisibility(View.VISIBLE);//将初始item在当前位置显示
			
			if(onChanageListener != null){
				onChanageListener.onChange(mDragPosition, tempPosition);
			}
			
			mDragPosition = tempPosition;
		}
	}
	
	//将所有开始隐藏的其他item显示出来,并移除生成的镜像
	private void onStopDrag(){
		getChildAt(mDragPosition - getFirstVisiblePosition()).setVisibility(View.VISIBLE);
		removeDragImage();
	}
	
	//获取状态栏高度
	private static int getStatusHeight(Context context){
        int statusHeight = 0;
        Rect localRect = new Rect();
        ((Activity) context).getWindow().getDecorView().getWindowVisibleDisplayFrame(localRect);
        statusHeight = localRect.top;
        if (0 == statusHeight){
            Class<?> localClass;
            try {
                localClass = Class.forName("com.android.internal.R$dimen");
                Object localObject = localClass.newInstance();
                int i5 = Integer.parseInt(localClass.getField("status_bar_height").get(localObject).toString());
                statusHeight = context.getResources().getDimensionPixelSize(i5);
            } catch (Exception e) {
                e.printStackTrace();
            } 
        }
        System.out.println(statusHeight);
        return statusHeight;
    }

//设置数据交换的方法from为move开始位置,to为目标位置,交换算法在主类中实现
	public interface OnChanageListener{
		public void onChange(int form, int to);
		public void addview(int from);
	}

	
	
}



And乔 2015-07-31
  • 打赏
  • 举报
回复
引用 16 楼 dcxy0 的回复:
[quote=引用 15 楼 xiaoqiaoq0 的回复:] [quote=引用 14 楼 xiaoqiaoq0 的回复:] [quote=引用 13 楼 dcxy0 的回复:] [quote=引用 12 楼 xiaoqiaoq0 的回复:] [quote=引用 11 楼 dcxy0 的回复:] [quote=引用 9 楼 xiaoqiaoq0 的回复:] [quote=引用 8 楼 dcxy0 的回复:] [quote=引用 7 楼 xiaoqiaoq0 的回复:] [quote=引用 6 楼 dcxy0 的回复:] MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事? [/quote] 肯定是复制有问题,看不到代码不知道你怎么复制的。 两种方式: 使用System.copy()这个方法. 第二个: //初始化新数组 for(var i =0;i<原来数组.length;i++){ 新数组[i]=原来数组[i]; } 看下你用的方式对不.[/quote] 额 我没说清楚,不是把所有元素复制过去,就复制一个元素,我是直接用的 public void addview(int from){ dataSourceList.add(dataSourceList1.get(from)); dataSourceList1.remove(dataSourceList1.get(from)); } 这个增加一个元素,增加的元素是另一个数组的元素内容 这样不行吗?[/quote] 你要判断下dataSourceList1.get(from) 这个是不是取到值了。[/quote] 额 我把那个函数放到一个监听事件中,他不崩了,但是抽屉中的图标还是拖不出去,我想问的是如何判断图标的imageview拖出抽屉,我之前是用距离屏幕的边缘距离判断的,但是我发现现在抽屉中的图标根本拖不出抽屉的范围了??额,就是这个问题,以前能拖出去的(就是一拖就死),现在不行了,还是要读那个日志文件吗?[/quote] 没明白你说的是什么意思。。。。。。[/quote] 是这样的,我做了一个抽屉,他占了大概半个屏幕的大小,抽屉中有一些图标,这些图标可以拖动,我的目的是可以把这些图标拖出去,之前是一往抽屉外拖就崩掉了,然后,改掉了那个问题,然后现在图标根本拖不出抽屉的范围了,是某些属性的设置问题嘛?[/quote] 额 这个问题 我解决了 问一个比较基础的问题,那个数组如何只复制一个元素过去 HashMap<String, Object> temp = new HashMap<String, Object>(); temp = dataSourceList1.get(from); dataSourceList.add(temp); 我是这么写的结果他把那个数组整个复制过去了[/quote] 是自己做的demo?可以分享下源码吗?感觉还是有可以优化的部分。[/quote] 是在网上找的一个图标拖动的demo给添加了一些我想要的东西,现在还有很大的问题,从抽屉中拖出去后,界面还没有更新,还得在在主界面交换一次才能更新,而且刷出来的图标一次增加了好多(还在研究是怎么回事),还有一个问题是主界面中的上半部分没办法移动了 是因为我的主界面和抽屉中调用的拖动函数是一个,所以判断是否拖出抽屉时,主界面和抽屉会有冲突 ,

package com.example.choutituodong;



import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import com.example.choutituodong.mydragview.OnChanageListener;
//import com.example.choutituodong.mydragview1.OnChanageListener1;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.app.Activity;
//import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ResolveInfo;
//import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.SlidingDrawer;

import android.util.Log;
//import android.widget.AdapterView.OnItemClickListener;

public class MainActivity extends Activity {
	

	private SlidingDrawer sd;
	private ImageView iv;
	private List<ResolveInfo> apps;
	private List<HashMap<String, Object>> dataSourceList = new ArrayList<HashMap<String, Object>>();
	private List<HashMap<String, Object>> dataSourceList1 = new ArrayList<HashMap<String, Object>>();
	
	

	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.slidingdrawer);
		

		final SimpleAdapter mSimpleAdapter = new SimpleAdapter(this, dataSourceList,
				R.layout.grid_item, new String[] { "item_image", "item_text" },
				new int[] { R.id.item_image, R.id.item_text });
		final SimpleAdapter mSimpleAdapter1 = new SimpleAdapter(this, dataSourceList1,
				R.layout.grid_item, new String[] { "item_image", "item_text" },
				new int[] { R.id.item_image, R.id.item_text });
		

			sd = (SlidingDrawer) findViewById(R.id.sliding);
    		iv = (ImageView) findViewById(R.id.imageViewIcon);
    		
    		mydragview mDragGridView = (mydragview) findViewById(R.id.dragGridView1);
			for (int i = 0; i < 12; i++) {
				HashMap<String, Object> itemHashMap = new HashMap<String, Object>();

				itemHashMap.put("item_image",R.drawable.ic_launcher);
				itemHashMap.put("item_text", "boy" + Integer.toString(i));
				dataSourceList.add(itemHashMap);
			}

		
		mDragGridView.setAdapter(mSimpleAdapter);
		mDragGridView.setOnChangeListener(new OnChanageListener() {
			
			@Override
//数据交换的具体实现与冒泡类似,让from位置的item依次与其后边的item交换直至到to位置
			public void onChange(int from, int to) {
				HashMap<String, Object> temp = dataSourceList.get(from);

				if(from < to){
					for(int i=from; i<to; i++){
						Collections.swap(dataSourceList, i, i+1);
					}
				}else if(from > to){
					for(int i=from; i>to; i--){
						Collections.swap(dataSourceList, i, i-1);
					}
				}
				
				dataSourceList.set(to, temp);				
				mSimpleAdapter.notifyDataSetChanged();
				
				
			}
			
			
			public  void  addview(int from){				

//			HashMap<String, Object> temp = dataSourceList1.get(from);
//				dataSourceList.add(temp);
//				dataSourceList1.remove(dataSourceList1.get(from));
				int a;
				a= dataSourceList.size();
               System.out.print(a);
			}			
		});
			
    		
 	//       loadApps();
 		   mydragview gv = (mydragview) findViewById(R.id.dragGridView);
 			for (int i = 0; i < 15; i++) {
 				HashMap<String, Object> itemHashMap = new HashMap<String, Object>();

 				itemHashMap.put("item_image",R.drawable.com_tencent_open_notice_msg_icon_big);
 				itemHashMap.put("item_text", "girl" + Integer.toString(i));
 				dataSourceList1.add(itemHashMap);
 			}

//        	gv.setAdapter(new GridAdapter());
 			 
			gv.setAdapter(mSimpleAdapter1);
			gv.setOnChangeListener(new OnChanageListener() {
				
				@Override
	//数据交换的具体实现与冒泡类似,让from位置的item依次与其后边的item交换直至到to位置
				public void onChange(int from, int to) {
					HashMap<String, Object> temp = dataSourceList1.get(from);

					if(from < to){
						for(int i=from; i<to; i++){
							Collections.swap(dataSourceList1, i, i+1);
						}
					}else if(from > to){
						for(int i=from; i>to; i--){
							Collections.swap(dataSourceList1, i, i-1);
						}
					}
					
					dataSourceList1.set(to, temp);				
					mSimpleAdapter1.notifyDataSetChanged();
					
					
				}
				
				public  void  addview(int from){				

	 				HashMap<String, Object> temp = new HashMap<String, Object>();
				    temp = dataSourceList1.get(from);
					dataSourceList.add(temp);
	//				dataSourceList1.remove(dataSourceList1.get(from));
					return;

				}
			});

    		
    	
			sd.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener()// 开抽屉
			{
				@Override
				public void onDrawerOpened() {
					iv.setImageResource(R.drawable.c);// 响应开抽屉事件
				}
			});
			sd.setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() {
				@Override
				public void onDrawerClosed() {
					iv.setImageResource(R.drawable.c);// 响应关抽屉事件
				}
			});
			
		
	

	}
	



	/*
	
	private void loadApps() {
		Intent intent = new Intent(Intent.ACTION_MAIN, null);
		intent.addCategory(Intent.CATEGORY_LAUNCHER);

		apps = getPackageManager().queryIntentActivities(intent, 0);
	}

	public class GridAdapter extends BaseAdapter {
		public GridAdapter() {

		}

		public int getCount() {
			// TODO Auto-generated method stub
			return apps.size();
		}

		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return apps.get(position);
		}

		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}


		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			ImageView imageView = null;
			if (convertView == null) {
				imageView = new ImageView(MainActivity.this);
				imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
				imageView.setLayoutParams(new GridView.LayoutParams(50, 50));
			} else {
				imageView = (ImageView) convertView;
			}

			ResolveInfo ri = apps.get(position);
			imageView.setImageDrawable(ri.activityInfo
					.loadIcon(getPackageManager()));
			
			return imageView;
		}

	}*/
}


And乔 2015-07-30
  • 打赏
  • 举报
回复
引用 14 楼 xiaoqiaoq0 的回复:
[quote=引用 13 楼 dcxy0 的回复:] [quote=引用 12 楼 xiaoqiaoq0 的回复:] [quote=引用 11 楼 dcxy0 的回复:] [quote=引用 9 楼 xiaoqiaoq0 的回复:] [quote=引用 8 楼 dcxy0 的回复:] [quote=引用 7 楼 xiaoqiaoq0 的回复:] [quote=引用 6 楼 dcxy0 的回复:] MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事? [/quote] 肯定是复制有问题,看不到代码不知道你怎么复制的。 两种方式: 使用System.copy()这个方法. 第二个: //初始化新数组 for(var i =0;i<原来数组.length;i++){ 新数组[i]=原来数组[i]; } 看下你用的方式对不.[/quote] 额 我没说清楚,不是把所有元素复制过去,就复制一个元素,我是直接用的 public void addview(int from){ dataSourceList.add(dataSourceList1.get(from)); dataSourceList1.remove(dataSourceList1.get(from)); } 这个增加一个元素,增加的元素是另一个数组的元素内容 这样不行吗?[/quote] 你要判断下dataSourceList1.get(from) 这个是不是取到值了。[/quote] 额 我把那个函数放到一个监听事件中,他不崩了,但是抽屉中的图标还是拖不出去,我想问的是如何判断图标的imageview拖出抽屉,我之前是用距离屏幕的边缘距离判断的,但是我发现现在抽屉中的图标根本拖不出抽屉的范围了??额,就是这个问题,以前能拖出去的(就是一拖就死),现在不行了,还是要读那个日志文件吗?[/quote] 没明白你说的是什么意思。。。。。。[/quote] 是这样的,我做了一个抽屉,他占了大概半个屏幕的大小,抽屉中有一些图标,这些图标可以拖动,我的目的是可以把这些图标拖出去,之前是一往抽屉外拖就崩掉了,然后,改掉了那个问题,然后现在图标根本拖不出抽屉的范围了,是某些属性的设置问题嘛?[/quote] 额 这个问题 我解决了 问一个比较基础的问题,那个数组如何只复制一个元素过去 HashMap<String, Object> temp = new HashMap<String, Object>(); temp = dataSourceList1.get(from); dataSourceList.add(temp); 我是这么写的结果他把那个数组整个复制过去了
And乔 2015-07-30
  • 打赏
  • 举报
回复
引用 13 楼 dcxy0 的回复:
[quote=引用 12 楼 xiaoqiaoq0 的回复:] [quote=引用 11 楼 dcxy0 的回复:] [quote=引用 9 楼 xiaoqiaoq0 的回复:] [quote=引用 8 楼 dcxy0 的回复:] [quote=引用 7 楼 xiaoqiaoq0 的回复:] [quote=引用 6 楼 dcxy0 的回复:] MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事? [/quote] 肯定是复制有问题,看不到代码不知道你怎么复制的。 两种方式: 使用System.copy()这个方法. 第二个: //初始化新数组 for(var i =0;i<原来数组.length;i++){ 新数组[i]=原来数组[i]; } 看下你用的方式对不.[/quote] 额 我没说清楚,不是把所有元素复制过去,就复制一个元素,我是直接用的 public void addview(int from){ dataSourceList.add(dataSourceList1.get(from)); dataSourceList1.remove(dataSourceList1.get(from)); } 这个增加一个元素,增加的元素是另一个数组的元素内容 这样不行吗?[/quote] 你要判断下dataSourceList1.get(from) 这个是不是取到值了。[/quote] 额 我把那个函数放到一个监听事件中,他不崩了,但是抽屉中的图标还是拖不出去,我想问的是如何判断图标的imageview拖出抽屉,我之前是用距离屏幕的边缘距离判断的,但是我发现现在抽屉中的图标根本拖不出抽屉的范围了??额,就是这个问题,以前能拖出去的(就是一拖就死),现在不行了,还是要读那个日志文件吗?[/quote] 没明白你说的是什么意思。。。。。。[/quote] 是这样的,我做了一个抽屉,他占了大概半个屏幕的大小,抽屉中有一些图标,这些图标可以拖动,我的目的是可以把这些图标拖出去,之前是一往抽屉外拖就崩掉了,然后,改掉了那个问题,然后现在图标根本拖不出抽屉的范围了,是某些属性的设置问题嘛?
JPF1024 2015-07-30
  • 打赏
  • 举报
回复
引用 12 楼 xiaoqiaoq0 的回复:
[quote=引用 11 楼 dcxy0 的回复:] [quote=引用 9 楼 xiaoqiaoq0 的回复:] [quote=引用 8 楼 dcxy0 的回复:] [quote=引用 7 楼 xiaoqiaoq0 的回复:] [quote=引用 6 楼 dcxy0 的回复:] MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事? [/quote] 肯定是复制有问题,看不到代码不知道你怎么复制的。 两种方式: 使用System.copy()这个方法. 第二个: //初始化新数组 for(var i =0;i<原来数组.length;i++){ 新数组[i]=原来数组[i]; } 看下你用的方式对不.[/quote] 额 我没说清楚,不是把所有元素复制过去,就复制一个元素,我是直接用的 public void addview(int from){ dataSourceList.add(dataSourceList1.get(from)); dataSourceList1.remove(dataSourceList1.get(from)); } 这个增加一个元素,增加的元素是另一个数组的元素内容 这样不行吗?[/quote] 你要判断下dataSourceList1.get(from) 这个是不是取到值了。[/quote] 额 我把那个函数放到一个监听事件中,他不崩了,但是抽屉中的图标还是拖不出去,我想问的是如何判断图标的imageview拖出抽屉,我之前是用距离屏幕的边缘距离判断的,但是我发现现在抽屉中的图标根本拖不出抽屉的范围了??额,就是这个问题,以前能拖出去的(就是一拖就死),现在不行了,还是要读那个日志文件吗?[/quote] 没明白你说的是什么意思。。。。。。
And乔 2015-07-30
  • 打赏
  • 举报
回复
引用 11 楼 dcxy0 的回复:
[quote=引用 9 楼 xiaoqiaoq0 的回复:] [quote=引用 8 楼 dcxy0 的回复:] [quote=引用 7 楼 xiaoqiaoq0 的回复:] [quote=引用 6 楼 dcxy0 的回复:] MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事? [/quote] 肯定是复制有问题,看不到代码不知道你怎么复制的。 两种方式: 使用System.copy()这个方法. 第二个: //初始化新数组 for(var i =0;i<原来数组.length;i++){ 新数组[i]=原来数组[i]; } 看下你用的方式对不.[/quote] 额 我没说清楚,不是把所有元素复制过去,就复制一个元素,我是直接用的 public void addview(int from){ dataSourceList.add(dataSourceList1.get(from)); dataSourceList1.remove(dataSourceList1.get(from)); } 这个增加一个元素,增加的元素是另一个数组的元素内容 这样不行吗?[/quote] 你要判断下dataSourceList1.get(from) 这个是不是取到值了。[/quote] 额 我把那个函数放到一个监听事件中,他不崩了,但是抽屉中的图标还是拖不出去,我想问的是如何判断图标的imageview拖出抽屉,我之前是用距离屏幕的边缘距离判断的,但是我发现现在抽屉中的图标根本拖不出抽屉的范围了??额,就是这个问题,以前能拖出去的(就是一拖就死),现在不行了,还是要读那个日志文件吗?
JPF1024 2015-07-30
  • 打赏
  • 举报
回复
引用 9 楼 xiaoqiaoq0 的回复:
[quote=引用 8 楼 dcxy0 的回复:] [quote=引用 7 楼 xiaoqiaoq0 的回复:] [quote=引用 6 楼 dcxy0 的回复:] MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事? [/quote] 肯定是复制有问题,看不到代码不知道你怎么复制的。 两种方式: 使用System.copy()这个方法. 第二个: //初始化新数组 for(var i =0;i<原来数组.length;i++){ 新数组[i]=原来数组[i]; } 看下你用的方式对不.[/quote] 额 我没说清楚,不是把所有元素复制过去,就复制一个元素,我是直接用的 public void addview(int from){ dataSourceList.add(dataSourceList1.get(from)); dataSourceList1.remove(dataSourceList1.get(from)); } 这个增加一个元素,增加的元素是另一个数组的元素内容 这样不行吗?[/quote] 你要判断下dataSourceList1.get(from) 这个是不是取到值了。
And乔 2015-07-30
  • 打赏
  • 举报
回复
是不是想这个函数调用数组内的数据 还需要设置一个监听事件??
And乔 2015-07-30
  • 打赏
  • 举报
回复
引用 8 楼 dcxy0 的回复:
[quote=引用 7 楼 xiaoqiaoq0 的回复:] [quote=引用 6 楼 dcxy0 的回复:] MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事? [/quote] 肯定是复制有问题,看不到代码不知道你怎么复制的。 两种方式: 使用System.copy()这个方法. 第二个: //初始化新数组 for(var i =0;i<原来数组.length;i++){ 新数组[i]=原来数组[i]; } 看下你用的方式对不.[/quote] 额 我没说清楚,不是把所有元素复制过去,就复制一个元素,我是直接用的 public void addview(int from){ dataSourceList.add(dataSourceList1.get(from)); dataSourceList1.remove(dataSourceList1.get(from)); } 这个增加一个元素,增加的元素是另一个数组的元素内容 这样不行吗?
JPF1024 2015-07-30
  • 打赏
  • 举报
回复
引用 15 楼 xiaoqiaoq0 的回复:
[quote=引用 14 楼 xiaoqiaoq0 的回复:] [quote=引用 13 楼 dcxy0 的回复:] [quote=引用 12 楼 xiaoqiaoq0 的回复:] [quote=引用 11 楼 dcxy0 的回复:] [quote=引用 9 楼 xiaoqiaoq0 的回复:] [quote=引用 8 楼 dcxy0 的回复:] [quote=引用 7 楼 xiaoqiaoq0 的回复:] [quote=引用 6 楼 dcxy0 的回复:] MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事? [/quote] 肯定是复制有问题,看不到代码不知道你怎么复制的。 两种方式: 使用System.copy()这个方法. 第二个: //初始化新数组 for(var i =0;i<原来数组.length;i++){ 新数组[i]=原来数组[i]; } 看下你用的方式对不.[/quote] 额 我没说清楚,不是把所有元素复制过去,就复制一个元素,我是直接用的 public void addview(int from){ dataSourceList.add(dataSourceList1.get(from)); dataSourceList1.remove(dataSourceList1.get(from)); } 这个增加一个元素,增加的元素是另一个数组的元素内容 这样不行吗?[/quote] 你要判断下dataSourceList1.get(from) 这个是不是取到值了。[/quote] 额 我把那个函数放到一个监听事件中,他不崩了,但是抽屉中的图标还是拖不出去,我想问的是如何判断图标的imageview拖出抽屉,我之前是用距离屏幕的边缘距离判断的,但是我发现现在抽屉中的图标根本拖不出抽屉的范围了??额,就是这个问题,以前能拖出去的(就是一拖就死),现在不行了,还是要读那个日志文件吗?[/quote] 没明白你说的是什么意思。。。。。。[/quote] 是这样的,我做了一个抽屉,他占了大概半个屏幕的大小,抽屉中有一些图标,这些图标可以拖动,我的目的是可以把这些图标拖出去,之前是一往抽屉外拖就崩掉了,然后,改掉了那个问题,然后现在图标根本拖不出抽屉的范围了,是某些属性的设置问题嘛?[/quote] 额 这个问题 我解决了 问一个比较基础的问题,那个数组如何只复制一个元素过去 HashMap<String, Object> temp = new HashMap<String, Object>(); temp = dataSourceList1.get(from); dataSourceList.add(temp); 我是这么写的结果他把那个数组整个复制过去了[/quote] 是自己做的demo?可以分享下源码吗?感觉还是有可以优化的部分。
JPF1024 2015-07-29
  • 打赏
  • 举报
回复
引用 7 楼 xiaoqiaoq0 的回复:
[quote=引用 6 楼 dcxy0 的回复:] MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事? [/quote] 肯定是复制有问题,看不到代码不知道你怎么复制的。 两种方式: 使用System.copy()这个方法. 第二个: //初始化新数组 for(var i =0;i<原来数组.length;i++){ 新数组[i]=原来数组[i]; } 看下你用的方式对不.
And乔 2015-07-29
  • 打赏
  • 举报
回复
引用 6 楼 dcxy0 的回复:
MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
越界了,我是把一个数组的元素复制到另一个数组内呀 ,复制的那个应该是我拖动的图标的信息,怎么会是空的??还有越界是怎么回事?
JPF1024 2015-07-29
  • 打赏
  • 举报
回复
MainActivity.java 193行的数组越界了,那个数组是空的,你还在取.
And乔 2015-07-29
  • 打赏
  • 举报
回复
引用 2 楼 dcxy0 的回复:
另外最好贴一下崩溃的那个地方的代码,不然光看崩溃原因也不知道是为啥。

And乔 2015-07-29
  • 打赏
  • 举报
回复
引用 2 楼 dcxy0 的回复:
另外最好贴一下崩溃的那个地方的代码,不然光看崩溃原因也不知道是为啥。
额额 在mainactivity public void addview(int from){ dataSourceList.add(dataSourceList1.get(from)); dataSourceList1.remove(dataSourceList1.get(from)); } 在mydragview private void onDragItem(int moveX, int moveY){ //计算手指位置相对于屏幕的距离,更新imageview的位置 mWindowLayoutParams.x = moveX - mPoint2ItemLeft + mOffset2Left; mWindowLayoutParams.y = moveY - mPoint2ItemTop + mOffset2Top - mStatusHeight; mWindowManager.updateViewLayout(mDragImageView, mWindowLayoutParams); if(mWindowLayoutParams.y<450){ MainActivity a1=new MainActivity(); a1.addview(mDragPosition); } else{ //调用itemswap函数 onSwapItem(moveX, moveY); } } 就是在我添加的这部分挂掉的 调用函数那部分
And乔 2015-07-29
  • 打赏
  • 举报
回复
引用 1 楼 u010668114 的回复:
崩溃就贴异常,你这样问没谁知道是为什么,也就无法给你说怎么做
异常?是将logcat的日志文件贴出来吗? 我把debug之后的日至文件复制过来了: 07-29 15:30:40.275: I/ViewRootImpl(10167): ANR Key Analyze: No Key event currently. 07-29 15:30:40.294: I/ViewRootImpl(10167): ANR Key Analyze: Previeous Event null,finish at 1970-01-01 08:00:00.000 07-29 15:30:40.316: I/ViewRootImpl(10167): Dispatch MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=95.042694, y[0]=45.79367, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=7, eventTime=47418000, downTime=47416381, deviceId=2, source=0x1002 } status is 5 0: Deliver pointer event,start at 2015-07-29 15:29:37.182, spent 63121ms. 07-29 15:30:40.318: I/ViewRootImpl(10167): The current processed event of VRI is MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=95.042694, y[0]=45.79367, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=7, eventTime=47418000, downTime=47416381, deviceId=2, source=0x1002 } 07-29 15:30:40.318: I/ViewRootImpl(10167): notify IMS Dump 还有就是我描述的思路是可以的吗?
JPF1024 2015-07-29
  • 打赏
  • 举报
回复
另外最好贴一下崩溃的那个地方的代码,不然光看崩溃原因也不知道是为啥。
加载更多回复(1)

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧