iPhone assistivetouchガジェット実装詳細1


今日も昨日も続いて
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:ソースが必要な方はご注意ください