아이폰 assistivetouch 위젯 구현 설명 1

오늘 우리는 어제의 것을 이어서 계속한다
1. 제어구의 클릭 드래그 실현
2、컨트롤볼을 클릭한 후 팝업 메뉴 선택 창
3. 메뉴 선택 기능은 사실 모두 어렵지 않다. 생각은 다음과 같다.
1. 우리의 제어구가 모든 앱 인터페이스 위에 떠 있는 것을 실현하려면 Window Manager를 통해 앱의 디스플레이 방식을 설정해야 한다.
2. 공을 제어하는 드래그: 온터치 리스트를 다시 쓰면 된다. 많은 사람들이 했다고 믿는다.
3. 팝업 메뉴 인터페이스와 메뉴 선택 기능: 이것은 비교적 보기 좋은 팝업 윈도우이다
이 몇 가지 분석을 통해 우리는 이 프로젝트가 사실은 비교적 간단하다는 것을 알 수 있다. 그래서 나는 줄곧 굳게 믿고 사고방식이 매우 중요하다고 생각한다.
우리 조금씩 이루자 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;
	}
    }
}

Service의 마스터 프로그램을 열려면 다음과 같이 하십시오.
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:원본이 필요한 분들은 유의하시기 바랍니다.

좋은 웹페이지 즐겨찾기