아이폰 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:원본이 필요한 분들은 유의하시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.