仿iPhone assistivetouch小工具实现详解1

今天我们接着昨天的继续

1、实现控制球的点击拖动

2、点击控制球后弹出菜单选择界面

3、菜单选择功能

其实这几个都不难,思路如下:

1、要实现我们的控制球悬浮在所有App界面之上:通过WindowManager来设置App的显示方式

2、控制球的拖动:重写onTouchListener即可,这个相信很多人都做过了

3、弹出菜单界面和菜单选择功能:这个就是一个比较好看的PopupWindow

通过这几条分析,我们可以发现,这个项目其实还是比较简单的哈,所以说,我一直坚信的,思路很重要

下面我们一点点来实现吧:so easy

程序核心必然是一个Service,相信我不要多说了:

MainService:

package com.xys.xtouchassistant.service;import com.xys.xtouchassistant.R;import android.app.Service;import android.content.Context;import android.content.Intent;import android.graphics.Color;import android.graphics.PixelFormat;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.os.IBinder;import android.provider.Settings;import android.util.DisplayMetrics;import android.view.Gravity;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.view.WindowManager;import android.widget.Button;import android.widget.PopupWindow;import android.widget.TextView;import android.widget.Toast;public class MainService extends Service implements OnClickListener, OnTouchListener {// 控制球Viewprivate View touchBallView;// 弹出菜单Viewprivate View menuView;// 控制球private Button touchBall;// WindowManagerWindowManager wm;// WindowManagerParamsWindowManager.LayoutParams params;private PopupWindow popup;// 点击坐标private float x, y;private float touchX, touchY;// 移动Flagprivate boolean isMoving;// Menu上的组件private TextView tvApps;private TextView tvHomeScreen;private TextView tvSetting;private TextView tvLockScreen;private TextView tvFavor;@Overridepublic void onCreate() {super.onCreate();// 初始化ViewsinitView();// 显示TouchBallcreateTouchBallView();// 监听事件regListener();}/*** 监听事件*/private void regListener() {touchBall.setOnTouchListener(this);touchBall.setOnClickListener(this);tvApps.setOnClickListener(this);tvHomeScreen.setOnClickListener(this);tvSetting.setOnClickListener(this);tvLockScreen.setOnClickListener(this);tvFavor.setOnClickListener(this);}/*** 初始化Views*/private void initView() {// 加载控制球ViewtouchBallView = LayoutInflater.from(this).inflate(R.layout.touch_ball, null);touchBall = (Button) touchBallView.findViewById(R.id.touch_ball);// 初始化MenuViewmenuView = LayoutInflater.from(this).inflate(R.layout.shown_menu, null);tvApps = (TextView) menuView.findViewById(R.id.tv_apps);tvHomeScreen = (TextView) menuView.findViewById(R.id.tv_home_screen);tvSetting = (TextView) menuView.findViewById(R.id.tv_setting);tvLockScreen = (TextView) menuView.findViewById(R.id.tv_lock_screen);tvFavor = (TextView) menuView.findViewById(R.id.tv_favor);}/*** 显示TouchBall*/private void createTouchBallView() {wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);params = new WindowManager.LayoutParams();params.type = WindowManager.LayoutParams.TYPE_PHONE;params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;params.gravity = Gravity.LEFT | Gravity.TOP;params.x = 0;params.y = 0;params.width = WindowManager.LayoutParams.WRAP_CONTENT;params.height = WindowManager.LayoutParams.WRAP_CONTENT;params.format = PixelFormat.RGBA_8888;wm.addView(touchBallView, params);}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.touch_ball:// 显示Popup菜单showMenuWindow();break;case R.id.tv_apps:// 显示Apps菜单Toast.makeText(this, "APPS", Toast.LENGTH_SHORT).show();popup.dismiss();break;case R.id.tv_favor:Toast.makeText(this, "FAVOR", Toast.LENGTH_SHORT).show();popup.dismiss();break;case R.id.tv_home_screen:// 显示主菜单Toast.makeText(this, "HOME", Toast.LENGTH_SHORT).show();popup.dismiss();break;case R.id.tv_lock_screen:// 锁屏Toast.makeText(this, "LOCK", Toast.LENGTH_SHORT).show();popup.dismiss();break;case R.id.tv_setting:// 显示Setting界面Toast.makeText(this, "SETTING", Toast.LENGTH_SHORT).show();popup.dismiss();break;default:popup.dismiss();break;}}/*** 显示Popup菜单*/private void showMenuWindow() {DisplayMetrics dm = getResources().getDisplayMetrics();popup = new PopupWindow(menuView, (int) (dm.widthPixels * 0.7), (int) (dm.heightPixels * 0.5));Drawable transpent = new ColorDrawable(Color.TRANSPARENT);popup.setBackgroundDrawable(transpent);popup.setFocusable(true);popup.setOutsideTouchable(true);popup.showAtLocation(touchBallView, Gravity.CENTER, 0, 0);popup.update();}/*** Touch监听事件*/@Overridepublic boolean onTouch(View v, MotionEvent event) {x = event.getRawX();y = event.getRawY();// 触摸事件switch (event.getAction()) {case MotionEvent.ACTION_DOWN:isMoving = false;// 触摸坐标赋值touchX = event.getX();touchY = event.getY();break;case MotionEvent.ACTION_MOVE:isMoving = true;// 触摸坐标赋值params.x = (int) (x – touchX);params.y = (int) (y – touchY);wm.updateViewLayout(touchBallView, params);break;case MotionEvent.ACTION_UP:// 触摸坐标赋值touchX = touchY = 0;break;default:break;}if (isMoving) {return true;} else {return false;}}}开启Service的主程序:

MainActivity:

如果有可能,我带你去远行。躺在德德玛的草原,

仿iPhone assistivetouch小工具实现详解1

相关文章:

你感兴趣的文章:

标签云: