仿iphone快速导航悬浮球.doc_第1页
仿iphone快速导航悬浮球.doc_第2页
仿iphone快速导航悬浮球.doc_第3页
仿iphone快速导航悬浮球.doc_第4页
仿iphone快速导航悬浮球.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

仿iphone快速导航悬浮球用过iphone的朋友都知道,iPhone有个圆球辅助工具,它漂浮在你的手机屏幕(在任何APP之上),你可以将它移动到任何地方,它叫做AssistiveTouch,本篇模拟该软件实现一个小案例,主要是实现它的界面,首先来看看实现的效果吧:为了让辅助工具一直悬浮在窗口之上,这里使用的机制是通过在程序初始化是,启动一个service,在service的onCreate() 函数中使用LayoutInflater来加载一个view,而这个view就是辅助球的布局文件:floatball.xml,然后对它进行onclick事件的监听,setOnClickListener监听到辅助球点击事件之后,就创建一个PopupWindow,弹出如上的菜单界面,大体的实现就是这样。其实,实现窗口悬浮于最前面的一个重要属性是:WindowManager.LayoutParams.TYPE_PHONE我们只要将WindowManager.LayoutParams的type属性设置为 WindowManager.LayoutParams.TYPE_PHONE就可以实现悬浮最前面。部分代码解析:MyApplication.Java:plain view plain copy print?在CODE上查看代码片派生到我的代码片package com.tyd.floatball.util; import android.app.Application; import android.view.WindowManager; public class MyApplication extends Application private WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams(); public WindowManager.LayoutParams getMywmParams() return wmParams; MainActivity.java:plain view plain copy print?在CODE上查看代码片派生到我的代码片package com.tyd.floatball.ui; import com.tyd.floatball.R; import com.tyd.floatball.R.layout; import com.tyd.floatball.service.TopFloatService; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class MainActivity extends Activity Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent service = new Intent(); service.setClass(this, TopFloatService.class); /启动服务 startService(service); TopFloatService.java:plain view plain copy print?在CODE上查看代码片派生到我的代码片package com.tyd.floatball.service; import android.app.Service; import android.content.Intent; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.os.IBinder; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnKeyListener; import android.view.View.OnTouchListener; import android.view.WindowManager; import android.widget.Button; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.Toast; import com.tyd.floatball.R; import com.tyd.floatball.util.MyApplication; public class TopFloatService extends Service implements OnClickListener,OnKeyListener WindowManager wm = null; WindowManager.LayoutParams ballWmParams = null; private View ballView; private View menuView; private float mTouchStartX; private float mTouchStartY; private float x; private float y; private RelativeLayout menuLayout; private Button floatImage; private PopupWindow pop; private RelativeLayout menuTop; private boolean ismoving = false; Override public void onCreate() super.onCreate(); /加载辅助球布局 ballView = LayoutInflater.from(this).inflate(R.layout.floatball, null); floatImage = (Button)ballView.findViewById(R.id.float_image); setUpFloatMenuView(); createView(); /* * 窗口菜单初始化 */ private void setUpFloatMenuView() menuView = LayoutInflater.from(this).inflate(R.layout.floatmenu, null); menuLayout = (RelativeLayout)menuView.findViewById(R.id.menu); menuTop = (RelativeLayout)menuView.findViewById(R.id.lay_main); menuLayout.setOnClickListener(this); menuLayout.setOnKeyListener(this); menuTop.setOnClickListener(this); /* * 通过MyApplication创建view,并初始化显示参数 */ private void createView() wm = (WindowManager) getApplicationContext().getSystemService(window); ballWmParams = (MyApplication) getApplication().getMywmParams(); ballWmParams.type = WindowManager.LayoutParams.TYPE_PHONE; ballWmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; ballWmParams.gravity = Gravity.LEFT | Gravity.TOP; ballWmParams.x = 0; ballWmParams.y = 0; ballWmParams.width = WindowManager.LayoutParams.WRAP_CONTENT; ballWmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; ballWmParams.format = PixelFormat.RGBA_8888; /添加显示层 wm.addView(ballView, ballWmParams); /注册触碰事件监听器 floatImage.setOnTouchListener(new OnTouchListener() public boolean onTouch(View v, MotionEvent event) x = event.getRawX(); y = event.getRawY(); switch (event.getAction() case MotionEvent.ACTION_DOWN: ismoving = false; mTouchStartX = (int)event.getX(); mTouchStartY = (int)event.getY(); break; case MotionEvent.ACTION_MOVE: ismoving = true; updateViewPosition(); break; case MotionEvent.ACTION_UP: mTouchStartX = mTouchStartY = 0; break; /如果拖动则返回false,否则返回true if(ismoving = false) return false; else return true; ); /注册点击事件监听器 floatImage.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) DisplayMetrics dm = getResources().getDisplayMetrics(); pop = new PopupWindow(menuView, dm.widthPixels, dm.heightPixels); pop.showAtLocation(ballView, Gravity.CENTER, 0, 0); pop.update(); ); /* * 更新view的显示位置 */ private void updateViewPosition() ballWmParams.x = (int) (x - mTouchStartX); ballWmParams.y = (int) (y - mTouchStartY); wm.updateViewLayout(ballView, ballWmParams); Override public IBinder onBind(Intent intent) return null; Override public void onClick(View v) switch (v.getId() case R.id.lay_main: Toast.makeText(getApplicationContext(), 111, 1000).show(); break; default: if(pop!=null & pop.isShowing() pop.dismiss(); break; Override public boolean onKey(View v, int keyCode, KeyEvent event) Toast.makeText(getApplicationContext(), keyCode:+keyCode, 1000).show(); Sch (keyCode) case KeyEvent.KEYCOD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论