码迷,mamicode.com
首页 > 其他好文 > 详细

小火箭实例

时间:2016-08-06 21:46:57      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

一、知识储备

1、在桌面显示一个View

WindowManager mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);

WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_PHONE;//电话窗口,它置于所有窗口
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
		| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
params.gravity=Gravity.LEFT + Gravity.TOP;//将重心设置为左上方,而不是默认的中心
params.setTitle("Toast");

View view = View.inflate(this, R.layout.rocket, null);
mWM.addView(view, params);

注意:

1、如果上次离开时,图标在边缘(超出屏幕),这时系统为了显示图标为缩小图标

  防止图标在拖放中超出屏幕

更新View方法1

@Override
public boolean onTouch(View v, MotionEvent event) {
	switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN: {
			// 获取起始坐标
			startX = (int) event.getRawX();
			startY = (int) event.getRawY();
			break;
		}
		case MotionEvent.ACTION_MOVE: {
			endX = (int) event.getRawX();
			endY = (int) event.getRawY();

			// 计算偏移量
			int dx = endX - startX;
			int dy = endY - startY;

			// 更新浮窗位置
			params.x += dx;
			params.y += dy;

			
			// 防止坐标偏离屏幕					
			if (params.x < 0) {
				params.x = 0;
			}
			if (params.y < 0) {
				params.y = 0;
			}
			if (params.x > winWidth - view.getWidth()) {
				params.x = winWidth - view.getWidth();
			}
			if (params.y > winWidth - view.getHeight()) {
				params.y = winWidth - view.getHeight();
			}
			mWM.updateViewLayout(view, params);//更新视图

			// 更新起点坐标
			startX = endX;
			startY = endY;
			break;
		}

		case MotionEvent.ACTION_UP:
			 //记录坐标点
			 Editor editor=mPref.edit();
			 editor.putInt("lastX", params.x);
			 editor.putInt("lastY", params.y);
			 editor.commit();
			sendRocket();					
			break;
		default:
			break;
	}
	return true;
}

  

  更新View方法2

@Override
public boolean onTouch(View v, MotionEvent event) {
	switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN: {
			// 获取起始坐标
			startX = (int) event.getRawX();
			startY = (int) event.getRawY();
			break;
		}
		case MotionEvent.ACTION_MOVE: {
			endX = (int) event.getRawX();
			endY = (int) event.getRawY();

			// 计算偏移量
			int dx = endX - startX;
			int dy = endY - startY;

			int left = view.getLeft() + dx;
			int top = view.getTop() + dy;
			int right = view.getRight() + dx;
			int bottom = view.getBottom() + dy;
			
			// 防止坐标偏离屏幕(注意状态栏高度)
			if(left < 0 || right>winWidth || top<0 || bottom>winHeight-20 ) {
				break;
			}
			
			view.layout(left,top,right,bottom);

			// 更新起点坐标
			startX = endX;
			startY = endY;
			break;
		}

		case MotionEvent.ACTION_UP:
			 //记录坐标点
			 Editor editor=mPref.edit();
			 editor.putInt("lastX", params.x);
			 editor.putInt("lastY", params.y);
			 editor.commit();
			sendRocket();					
			break;
		default:
			break;
	}
	return true;
}

2、安卓底层在画图标时分三步onMeasure(测量View),onLayout(安放位置),onDraw(绘制)

 不能在Activity的onCreate(还没测量完)中使用view.layout(left,top,right,bottom);

解决办法:

 	//保存最后离开时的位置
	private SharedPreferences mPref;
	mPref = getSharedPreferences("config", MODE_PRIVATE);
	mPref = getSharedPreferences("config", MODE_PRIVATE);
	Editor editor=mPref.edit();
	editor.putInt("lastX", params.x);
	editor.putInt("lastY", params.y);
	editor.commit()
 	//还原上次离开时的位置
	int lastX=mPref.getInt("lastX", 10);
	int lastY=mPref.getInt("lastY", 10);

	LayoutParams layoutParams=(LayoutParams) view.getLayoutParams();
	layoutParams.leftMargin=lastX;//设置左边距
	layoutParams.topMargin=lastY;//设置右边距
	view.setLayoutParams(layoutParams);

  

 

  

小火箭实例

标签:

原文地址:http://www.cnblogs.com/324sige/p/5744918.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!