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就可以了。
以下上本人亲手实现的,上面是实现的一些步骤,希望对大家有帮助!
更多相关文章
- Android内核开发:在源码树中添加新的app应用
- 开源项目收集整理
- Android(安卓)wifi的WifiInfo对象详解
- Android下如何获取Mac地址?
- Android彩蛋效果,微信彩蛋效果
- Android(安卓)studio 运行即打包keystore之build.gradle设置
- Android(安卓)重要知识学习整理
- Android(安卓)源码下载、编译以及编译自己的apk
- 介绍三个Android支持库控件:TabLayout+ViewPager+RecyclerView