首先,我前面有一片博客写的是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就可以了。


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



更多相关文章

  1. Android内核开发:在源码树中添加新的app应用
  2. 开源项目收集整理
  3. Android(安卓)wifi的WifiInfo对象详解
  4. Android下如何获取Mac地址?
  5. Android彩蛋效果,微信彩蛋效果
  6. Android(安卓)studio 运行即打包keystore之build.gradle设置
  7. Android(安卓)重要知识学习整理
  8. Android(安卓)源码下载、编译以及编译自己的apk
  9. 介绍三个Android支持库控件:TabLayout+ViewPager+RecyclerView

随机推荐

  1. android opengl es 2.0 draw circle
  2. Android(安卓)实现模拟地图定位功能
  3. android studio 提示Error:Default Activ
  4. Android之Action_SEND小例子
  5. android部分权限列表
  6. Android(安卓)错误 java.lang.IllegalSta
  7. Android开发工程师笔试题
  8. Android(安卓)异常收集哦
  9. Android(安卓)复杂界面开发实践之 ViewCo
  10. Android项目集成ReactNative及遇到问题