iPhone assistivetouchガジェット実装詳細1
今日も昨日も続いて
1、コントロールボールのクリックドラッグを実現する
2、コントロールボールをクリックしてメニュー選択画面をポップアップする
3、メニュー選択機能は実はこのいくつかは難しくなくて、構想は以下の通りです.
1、我々のコントロールボールをすべてのAppインタフェースの上に浮かべることを実現するには:WindowManagerを通じてAppの表示方式を設定する
2、ボールのドラッグをコントロールする:onTouchListenerを書き直せばいい.これは多くの人がやったと信じている.
3、ポップアップメニュー画面とメニュー選択機能:これは比較的にきれいなPopupWindowである.
このいくつかの分析を通じて、私たちは発見することができて、このプロジェクトは実は比較的に簡単で、だから、私はずっと信じて、構想はとても重要です
次は少しずつ実現しましょう:so easy
プログラムのコアは必ずサービスであり、私は多く言わないでください.
MainService:
サービスのメインプログラムを開きます.
MainActivity:
ここでは単純にActivityでこのサービスを開くだけで、後でサービスを開く方法を再実現します.
1、起動放送イベントを登録してサービスを開始する
2、プロセスガードによってサービスがkillされないことを実現する(通知パネルにサービスを明示的に表示することによってkillされることを防止することもできる)
3、メニューインタフェース機能の配置化を実現する
ps:ソースが必要な方はご注意ください
1、コントロールボールのクリックドラッグを実現する
2、コントロールボールをクリックしてメニュー選択画面をポップアップする
3、メニュー選択機能は実はこのいくつかは難しくなくて、構想は以下の通りです.
1、我々のコントロールボールをすべてのAppインタフェースの上に浮かべることを実現するには:WindowManagerを通じてAppの表示方式を設定する
2、ボールのドラッグをコントロールする:onTouchListenerを書き直せばいい.これは多くの人がやったと信じている.
3、ポップアップメニュー画面とメニュー選択機能:これは比較的にきれいなPopupWindowである.
このいくつかの分析を通じて、私たちは発見することができて、このプロジェクトは実は比較的に簡単で、だから、私はずっと信じて、構想はとても重要です
次は少しずつ実現しましょう:so easy
プログラムのコアは必ずサービスであり、私は多く言わないでください.
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 {
// View
private View touchBallView;
// View
private View menuView;
//
private Button touchBall;
// WindowManager
WindowManager wm;
// WindowManagerParams
WindowManager.LayoutParams params;
private PopupWindow popup;
//
private float x, y;
private float touchX, touchY;
// Flag
private boolean isMoving;
// Menu
private TextView tvApps;
private TextView tvHomeScreen;
private TextView tvSetting;
private TextView tvLockScreen;
private TextView tvFavor;
@Override
public void onCreate() {
super.onCreate();
// Views
initView();
// TouchBall
createTouchBallView();
//
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() {
// View
touchBallView = LayoutInflater.from(this).inflate(R.layout.touch_ball, null);
touchBall = (Button) touchBallView.findViewById(R.id.touch_ball);
// MenuView
menuView = 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);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public 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
*/
@Override
public 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;
}
}
}
サービスのメインプログラムを開きます.
MainActivity:
package com.xys.xtouchassistant.activity;
import com.xys.xtouchassistant.R;
import com.xys.xtouchassistant.service.MainService;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent service = new Intent();
service.setClass(this, MainService.class);
startService(service);
}
}
ここでは単純にActivityでこのサービスを開くだけで、後でサービスを開く方法を再実現します.
1、起動放送イベントを登録してサービスを開始する
2、プロセスガードによってサービスがkillされないことを実現する(通知パネルにサービスを明示的に表示することによってkillされることを防止することもできる)
3、メニューインタフェース機能の配置化を実現する
ps:ソースが必要な方はご注意ください