记录开发一个手势体感功能—两指调节音量
触摸屏的功能肯定会用到PhoneWindow.java,在frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java下面(基于Android6.0),
//add (start)
import android.content.Intent;
import android.content.ContentResolver;
import android.provider.Settings;
import android.app.Instrumentation;
import java.text.DecimalFormat;
//add (end)
public class PhoneWindow extends Window implements MenuBuilder.Callback {
private final static String TAG = "PhoneWindow";
//add (start)
private Context mContext;
private int pointy1 = 0;
private int pointy2 = 0;
private int mpointy1 = 0;
private int mpointy2 = 0;
private boolean is_move = false;
private boolean isSendKeyCodeThreadStart = false;
//add (end)
public PhoneWindow(Context context) {
super(context);
//add (start)
mContext = context;
//add (end)
mLayoutInflater = LayoutInflater.from(context);
}
//add (start)
private boolean setStreamVolume(MotionEvent ev){
if(ev.getAction()== MotionEvent.ACTION_POINTER_2_DOWN){
pointy1= (int) ev.getAxisValue(MotionEvent.AXIS_Y, 0);
pointy2= (int) ev.getAxisValue(MotionEvent.AXIS_Y, 1);
}else if(ev.getAction()== MotionEvent.ACTION_MOVE){
try {
mpointy1 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 0);
mpointy2 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 1);
}catch (IllegalArgumentException i) {
//do nothing
}
if((mpointy1 > pointy1) && (mpointy2 > pointy2)){
try {
pointy1 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 0);
pointy2 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 1);
}catch (IllegalArgumentException i) {
//do nothing
}
if(!isSendKeyCodeThreadStart){
sendKeyCode(KeyEvent.KEYCODE_VOLUME_DOWN);
//sendKeyCode((float)mpointy1);
}
is_move = true;
Log.e("pp","===========111============");
}else if((mpointy1 < pointy1) && (mpointy2 < pointy2)){
try {
pointy1 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 0);
pointy2 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 1);
}catch (IllegalArgumentException i) {
//do nothing
}
if(!isSendKeyCodeThreadStart){
sendKeyCode(KeyEvent.KEYCODE_VOLUME_UP);
//sendKeyCode((float)mpointy1);
}
is_move = true;
Log.e("pp","===========222============");
}
}else if(ev.getAction() == MotionEvent.ACTION_UP
|| ev.getAction() == MotionEvent.ACTION_POINTER_2_UP){
isSendKeyCodeThreadStart = false;
return false;
}
return false;
}
private void sendKeyCode(final int keyCode){
new Thread() {
@Override
public void run() {
isSendKeyCodeThreadStart = true;
Instrumentation instrumentation = new Instrumentation();
while (isSendKeyCodeThreadStart) {
if(is_move){
try {
instrumentation.sendKeyDownUpSync(keyCode);
Log.e("pp","===========keyCode============"+keyCode);
} catch (Exception e) {
e.printStackTrace();
Log.e("pp","========Exception======");
}
is_move = false;
}
Log.e("pp","===========OOO============");
}
}
}.start();
}
//add (end)
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
final Callback cb = getCallback();
if (DBG_MOTION) {
Log.d(TAG, "dispatchTouchEvent = " + ev + ", cb = " + cb + ", destroyed? = "
+ isDestroyed() + ", mFeatureId = " + mFeatureId);
}
ContentResolver resolver = mContext.getContentResolver();
//add (start)
if (Settings.System.getInt(resolver, "Two_fingers_Switch_themes", 0) == 1){
setStreamVolume(ev);
}
//add(end)
return cb != null && !isDestroyed() && mFeatureId < 0 ? cb.dispatchTouchEvent(ev)
: super.dispatchTouchEvent(ev);
}
然后在settings里面在加一个界面(针对Android6.0)代码,如下:
package com.android.settings;
import android.content.ContentResolver;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.SystemProperties;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment;
import android.provider.Settings;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.util.Log;
public class FingerGestureSettings extends PreferenceFragment
implements Preference.OnPreferenceChangeListener, OnPreferenceClickListener {
private static final String TAG = "FingerGestureSettings";
private static final String KEY_TWO_FINGER_CHANGEVOLUME = "two_fingers_changevolume";
private SwitchPreference mTwoFingerChangeVolume;
private ContentResolver mResolver = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.finger_gesture_settings);
mResolver = getActivity().getContentResolver();
mTwoFingerChangeVolume = (SwitchPreference) findPreference(KEY_TWO_FINGER_CHANGEVOLUME);
mTwoFingerChangeVolume.setOnPreferenceClickListener(this);
mTwoFingerChangeVolume.setOnPreferenceChangeListener(this);
mTwoFingerChangeVolume.setPersistent(false);
if (getResources().getBoolean(R.bool.remove_two_finger_changevolume)) {
getPreferenceScreen().removePreference(mTwoFingerChangeVolume);
}
mTwoFingerChangeVolume.setChecked((Settings.System.getInt(mResolver, "Two_fingers_Switch_themes", 0) == 1) ? true : false);
Log.d(TAG, "mTwoFingerChangeVolume=" + Settings.System.getInt(mResolver, "Two_fingers_Switch_themes", 0) + " ");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
public void onPause() {
super.onPause();
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
Log.e(TAG, "onPreferenceTreeClick");
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
public boolean onPreferenceChange(Preference preference, Object objValue) {
final String key = preference.getKey();
Log.e(TAG, "onPreferenceChange,key=" + key);
if (KEY_TWO_FINGER_CHANGEVOLUME.equals(key)) {
boolean checked = mTwoFingerChangeVolume.isChecked();
Log.e(TAG, "checked=" + !checked);
Settings.System.putInt(mResolver, "Two_fingers_Switch_themes", !checked ? 1 : 0);
Log.e(TAG, "two_fingers_changevolume=" + Settings.System.getInt(mResolver, "Two_fingers_Switch_themes", 0));
}
return true;
}
@Override
public boolean onPreferenceClick(Preference preference) {
Log.e(TAG, "onPreferenceClick");
return false;
}
}
settings里面还要找到相应的布局文件添加一下布局即可,如:新建一个xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/two_finger_changevolume_title" >
<SwitchPreference
android:key="two_fingers_changevolume"
android:summary="@string/accessibility_two_fingers_changevolume_summary"
android:title="@string/accessibility_two_fingers_changevolume_title" />
</PreferenceScreen>
如上基本可以在settings里面添加一个功能:两指调节音量
本文详细记录了在Android 6.0系统中开发一个两指调节音量的手势体感功能。涉及到的关键代码位于PhoneWindow.java,并在Settings中添加相应界面和布局文件,从而实现在设置中添加这一特色功能。

1911

被折叠的 条评论
为什么被折叠?



