settings里添加两指调节音量item及功能

本文详细记录了在Android 6.0系统中开发一个两指调节音量的手势体感功能。涉及到的关键代码位于PhoneWindow.java,并在Settings中添加相应界面和布局文件,从而实现在设置中添加这一特色功能。

记录开发一个手势体感功能—两指调节音量
触摸屏的功能肯定会用到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里面添加一个功能:两指调节音量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值