Android setting中添加桌面循环滑动选项


     首先,我前面有一片博客写的是android桌面(launch2)循环滑动,这里想加以改进,因为在我们所使用的手机中已经在“设置”的“辅助功能”中有选择是否“桌面循环”。



这里我想做的就是在原生的android源码上添加这一功能,主要还是以学习为主。


看这个之前我希望你们看一下android桌面(launch2)循环滑动这篇博客。


首先我是在做好了桌面循环之后去做在“设置”中添加这一项,所以怎么去做循环滑动这里就不再讲。


先看看图片吧:


这里的循环桌面就是我添加的。


先讲一下思路吧:先把界面做出来,再将是否选择的值存到系统的(adb shell进入)data/data/com.android.providers.settings/databases/settings.db数据库中的system表中,


然后在Launch2的源码中取得数据库中是否选择循环桌面来执行相关代码。


先做UI:


在settings源码中的accessibility_settings.xml文件中添加一个checkbox:

 <!-- add by xxnan -->
    <CheckBoxPreference
            android:key="launch_repeat"
            android:title="@string/launch_repeat_title"
            android:persistent="false"/>

在settings源码的res中添加相关的代码:

在values/string.xml中添加(英文显示):

<string name="launch_repeat_title">Launch Repeat</string>


在values-zh-rCN/string.xml中添加(中文显示):

<string name="launch_repeat_title" msgid="4676390750360727396">"循环桌面"</string>


在settings源码的AccessibilitySettings.java中的OnCreate中添加:

/*****************************************/
        mLaunchRepeat=(CheckBoxPreference) findPreference(
            LAUNCH_REPEAT);
	 int LaunchRepeat=Settings.System.getInt(this.getContentResolver(),
                    "launch_repeat",0);//取出是否被选择
	 if(LaunchRepeat==1)//如果被选择,那么下次打开setting时就勾选
	 	mLaunchRepeat.setChecked(true);
	 else
	 	mLaunchRepeat.setChecked(false);//如果没被选择,那么下次打开setting时就不勾选
	/*****************************************/	
当然还要定义几个量:

private final String LAUNCH_REPEAT =
        "launch_repeat";   
private CheckBoxPreference mLaunchRepeat;


在onPreferenceTreeClick函数中添加:


//add by xxnan
	  if(LAUNCH_REPEAT.equals(key))
	 	{
                 Settings.System.putInt(getContentResolver(),
                    "launch_repeat",
                    ((CheckBoxPreference) preference).isChecked()? 1:0);//将是否选择存到系统的system表中
	       }
         //add by xxnan


如果做好了之后当你点击选择“桌面循环时”可以到(adb shell进入)data/data/com.android.providers.settings/databases下的settings.db数据库(sqlite3 settings.db)的system


表中看到33|launch_repeat|1(select * from system;)。

到这里就完成了将数据存到系统system表中以及UI,接下来就是在Launch2源码中去取这个值(是否循环)。



到Launcher2源码中去找到Workspace.java文件,在里面有相应的修改:


在onTouchEvent中,之前我们有修改循环,如下:

 case MotionEvent.ACTION_UP:
            if (mTouchState == TOUCH_STATE_SCROLLING) {
                final VelocityTracker velocityTracker = mVelocityTracker;
                velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
                final int velocityX = (int) velocityTracker.getXVelocity(mActivePointerId);
               
                final int screenWidth = getWidth();
                final int whichScreen = (mScrollX + (screenWidth / 2)) / screenWidth;
                final float scrolledPos = (float) mScrollX / screenWidth;
				 Log.i("velocityX","velocityX="+velocityX+"whichScreen="+whichScreen);
	         /***********************************************/
	         //modifided by xxnan
	            
	          if (velocityX > SNAP_VELOCITY) {
                    // Fling hard enough to move left.
                    // Don't fling across more than one screen at a time.
                    Log.i("numscreen","numscreen="+mCurrentScreen);
                   /* final int bound = scrolledPos < whichScreen ?
                           ( (mCurrentScreen+ getChildCount()) - 1 )% getChildCount(): mCurrentScreen;*/
                     final int bound =( (mCurrentScreen+ getChildCount()) - 1 )% getChildCount() ; 
			Log.i("numscreen","bound="+bound);		
                    snapToScreen( bound, velocityX, true);
                } else if (velocityX < -SNAP_VELOCITY ) {
                    // Fling hard enough to move right
                    // Don't fling across more than one screen at a time.
                    /*final int bound = scrolledPos > whichScreen ?
                           ( mCurrentScreen + 1 )% getChildCount(): mCurrentScreen;*/
                       final int bound = ( mCurrentScreen + 1 )% getChildCount() ;     
                    snapToScreen(bound, velocityX, true);
                } else {
                    snapToScreen(whichScreen, 0, true);
                }
		
	         /***********************************************/		 
                //下面是原生代码
                /*if (velocityX > SNAP_VELOCITY && mCurrentScreen > 0) {
                    // Fling hard enough to move left.
                    // Don't fling across more than one screen at a time.
                    final int bound = scrolledPos < whichScreen ?
                            mCurrentScreen - 1 : mCurrentScreen;
                    snapToScreen(Math.min(whichScreen, bound), velocityX, true);
                } else if (velocityX < -SNAP_VELOCITY && mCurrentScreen < getChildCount() - 1) {
                    // Fling hard enough to move right
                    // Don't fling across more than one screen at a time.
                    final int bound = scrolledPos > whichScreen ?
                            mCurrentScreen + 1 : mCurrentScreen;
                    snapToScreen(Math.max(whichScreen, bound), velocityX, true);
                } else {
                    snapToScreen(whichScreen, 0, true);
                }*/
            }
            mTouchState = TOUCH_STATE_REST;
            mActivePointerId = INVALID_POINTER;
            releaseVelocityTracker();
            break;

那么我们就要在修改的地方加一个判断,如果system中取得的值是1,就可以循环,如果是0,就不能。


代码修改如下:


 case MotionEvent.ACTION_UP:
            if (mTouchState == TOUCH_STATE_SCROLLING) {
                final VelocityTracker velocityTracker = mVelocityTracker;
                velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
                final int velocityX = (int) velocityTracker.getXVelocity(mActivePointerId);
               
                final int screenWidth = getWidth();
                final int whichScreen = (mScrollX + (screenWidth / 2)) / screenWidth;
                final float scrolledPos = (float) mScrollX / screenWidth;
				 Log.i("velocityX","velocityX="+velocityX+"whichScreen="+whichScreen);
	         /***********************************************/
	         //modifided by xxnan 2013-1-9
	             launch_repeat=Settings.System.getInt(mContext.getContentResolver(),
                    "launch_repeat",0);//取出system表中“launch_repeat”的值
			 Log.i(" launch_repeat"," launch_repeat="+ launch_repeat);
		if(launch_repeat==1)//如果是1,就循环,也就是之前已经改好的
			{
	          if (velocityX > SNAP_VELOCITY) {
                    // Fling hard enough to move left.
                    // Don't fling across more than one screen at a time.
                    Log.i("numscreen","numscreen="+mCurrentScreen);
                   /* final int bound = scrolledPos < whichScreen ?
                           ( (mCurrentScreen+ getChildCount()) - 1 )% getChildCount(): mCurrentScreen;*/
                     final int bound =( (mCurrentScreen+ getChildCount()) - 1 )% getChildCount() ; 
			Log.i("numscreen","bound="+bound);		
                    snapToScreen( bound, velocityX, true);
                } else if (velocityX < -SNAP_VELOCITY ) {
                    // Fling hard enough to move right
                    // Don't fling across more than one screen at a time.
                    /*final int bound = scrolledPos > whichScreen ?
                           ( mCurrentScreen + 1 )% getChildCount(): mCurrentScreen;*/
                       final int bound = ( mCurrentScreen + 1 )% getChildCount() ;     
                    snapToScreen(bound, velocityX, true);
                } else {
                    snapToScreen(whichScreen, 0, true);
                }
		}
		else//如果是0,那么就是原生代码,不循环
			{
                       if (velocityX > SNAP_VELOCITY && mCurrentScreen > 0) {
                    // Fling hard enough to move left.
                    // Don't fling across more than one screen at a time.
                    final int bound = scrolledPos < whichScreen ?
                            mCurrentScreen - 1 : mCurrentScreen;
                    snapToScreen(Math.min(whichScreen, bound), velocityX, true);
                } else if (velocityX < -SNAP_VELOCITY && mCurrentScreen < getChildCount() - 1) {
                    // Fling hard enough to move right
                    // Don't fling across more than one screen at a time.
                    final int bound = scrolledPos > whichScreen ?
                            mCurrentScreen + 1 : mCurrentScreen;
                    snapToScreen(Math.max(whichScreen, bound), velocityX, true);
                } else {
                    snapToScreen(whichScreen, 0, true);
                }
                
		       }
	         /***********************************************/		 
                //下面是原生代码
                /*if (velocityX > SNAP_VELOCITY && mCurrentScreen > 0) {
                    // Fling hard enough to move left.
                    // Don't fling across more than one screen at a time.
                    final int bound = scrolledPos < whichScreen ?
                            mCurrentScreen - 1 : mCurrentScreen;
                    snapToScreen(Math.min(whichScreen, bound), velocityX, true);
                } else if (velocityX < -SNAP_VELOCITY && mCurrentScreen < getChildCount() - 1) {
                    // Fling hard enough to move right
                    // Don't fling across more than one screen at a time.
                    final int bound = scrolledPos > whichScreen ?
                            mCurrentScreen + 1 : mCurrentScreen;
                    snapToScreen(Math.max(whichScreen, bound), velocityX, true);
                } else {
                    snapToScreen(whichScreen, 0, true);
                }*/
            }
            mTouchState = TOUCH_STATE_REST;
            mActivePointerId = INVALID_POINTER;
            releaseVelocityTracker();
            break;

当然这里面也要定义几个量,以及导入几个包:

导入包:

//add by xxnan
import android.content.ContentResolver;//从system表中取数据
import android.provider.Settings;

定义变量:

private int launch_repeat;//取得是否循环的值

到这里就全部修改好了,还有就是编译一下源码中的package/apps的Launch2和Settings的源码,将生成的out/target/。。。/system/app下的

Launch2.apk和Settings.apk替换手机里system/app的这两个apk就可以了。


以下上本人亲手实现的,上面是实现的一些步骤,希望对大家有帮助!



  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值