androidgallery循环
① android怎么viewpager实现循环切换图片
Android中的ViewPager则实现了左右滑动的效果,ViewPager类提供了多界面切换的新效果。利用ViewPager实现图片循环滚动代码如下:
1、首先是布局文件,使用了一个ViewPager控件:
java"><spanstyle="padding:0px;margin:0px;font-size:14px;"><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical"
android:padding="5dip">
<TextView
android:id="@+id/tv_image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="第一个引导页面"
android:textColor="@android:color/white"
android:textSize="14sp"/>
<LinearLayout
android:id="@+id/ll_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
</RelativeLayout></span>
2、接下来实现一个继承PagerAdapter的MyAdapter类,实现一个PagerAdapter,代码如下:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.List;
importandroid.support.v4.view.PagerAdapter;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ImageView;
{
privateList<ImageView>mImageViewList;
publicViewPagerAdapter(List<ImageView>imageViewList){
super();
this.mImageViewList=imageViewList;
}
/**
*该方法将返回所包含的Item总个数。为了实现一种循环滚动的效果,返回了基本整型的最大值,这样就会创建很多的Item,
*其实这并非是真正的无限循环。
*/
@Override
publicintgetCount(){
returnInteger.MAX_VALUE;
}
/**
*判断出去的view是否等于进来的view如果为true直接复用
*/
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==arg1;
}
/**
*销毁预加载以外的view对象,会把需要销毁的对象的索引位置传进来,就是position,
*因为mImageViewList只有五条数据,而position将会取到很大的值,
*所以使用取余数的方法来获取每一条数据项。
*/
@Override
publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){
container.removeView(mImageViewList.get(position%mImageViewList.size()));
}
/**
*创建一个view,
*/
@Override
publicObjectinstantiateItem(ViewGroupcontainer,intposition){
container.addView(mImageViewList.get(position%mImageViewList.size()));
returnmImageViewList.get(position%mImageViewList.size());
}
}
</span>
3、最后是主界面部分的代码:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.os.SystemClock;
importandroid.support.v4.view.ViewPager;
importandroid.support.v4.view.ViewPager.OnPageChangeListener;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.LinearLayout.LayoutParams;
importandroid.widget.TextView;
{
privateList<ImageView>imageViewList;
privateTextViewtvDescription;
privateLinearLayoutllPoints;
privateString[]imageDescriptions;
=0;
privateViewPagermViewPager;
privatebooleanisLoop=true;
privateHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1);
}
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setView();
initView();
}
publicvoidsetView(){
setContentView(R.layout.activity_splash_viewpager);
//自动切换页面功能
newThread(newRunnable(){
@Override
publicvoidrun(){
while(isLoop){
SystemClock.sleep(2000);
handler.sendEmptyMessage(0);
}
}
}).start();
}
publicvoidinitView(){
mViewPager=(ViewPager)findViewById(R.id.viewpager);
tvDescription=(TextView)findViewById(R.id.tv_image_description);
llPoints=(LinearLayout)findViewById(R.id.ll_points);
prepareData();
ViewPagerAdapteradapter=newViewPagerAdapter(imageViewList);
mViewPager.setAdapter(adapter);
mViewPager.setOnPageChangeListener(this);
tvDescription.setText(imageDescriptions[previousSelectPosition]);
llPoints.getChildAt(previousSelectPosition).setEnabled(true);
/**
*2147483647/2=1073741820-1
*设置ViewPager的当前项为一个比较大的数,以便一开始就可以左右循环滑动
*/
intn=Integer.MAX_VALUE/2%imageViewList.size();
intitemPosition=Integer.MAX_VALUE/2-n;
mViewPager.setCurrentItem(itemPosition);
}
privatevoidprepareData(){
imageViewList=newArrayList<ImageView>();
int[]imageResIDs=getImageResIDs();
imageDescriptions=getImageDescription();
ImageViewiv;
Viewview;
for(inti=0;i<imageResIDs.length;i++){
iv=newImageView(this);
iv.setBackgroundResource(imageResIDs[i]);
imageViewList.add(iv);
//添加点view对象
view=newView(this);
view.setBackgroundDrawable(getResources().getDrawable(R.drawable.point_background));
LayoutParamslp=newLayoutParams(5,5);
lp.leftMargin=10;
view.setLayoutParams(lp);
view.setEnabled(false);
llPoints.addView(view);
}
}
privateint[]getImageResIDs(){
returnnewint[]{
R.drawable.bg1,
R.drawable.bg2,
R.drawable.bg3,
R.drawable.pic_01,
R.drawable.pic_02
};
}
privateString[]getImageDescription(){
returnnewString[]{
"第一个引导页面",
"第二个引导页面",
"第三个引导页面",
"第四个引导页面",
"第五个引导页面"
};
}
@Override
(intarg0){
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageSelected(intposition){
//改变图片的描述信息
tvDescription.setText(imageDescriptions[position%imageViewList.size()]);
//切换选中的点,把前一个点置为normal状态
llPoints.getChildAt(previousSelectPosition).setEnabled(false);
//把当前选中的position对应的点置为enabled状态
llPoints.getChildAt(position%imageViewList.size()).setEnabled(true);
previousSelectPosition=position%imageViewList.size();
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
isLoop=false;
}
}
</span>
② Android TV中实现RecyView循环功能
RecycleView 用法 :
1. [endif]在Gradle中添加
implementation 'com.android.support:recyclerview-v7:26.0.2'
2. [endif]在主布局文件里添加RecycleView
3. [endif]创建item布局文件
在电视开发中,需要添加focusable 与 focusableintouchmode 才可以获得焦点。
4. [endif]创建adapter继承RecyclerView.Adapter
5. [endif] 在adapter中添加缺省方法
1) [endif]On create ViewHolder()方法是将item布局加载到recycleView 的方法
View view = LayoutInflater. from (parent.getContext()).inflate(R.layout. item_2 , parent, false);
创建一个ViewHolder,并添加到ViewHolder里面去,最后返回这个ViewHolder:
ViewHolder holder = new ViewHolder(view);return holder;
2) OnbindViewHolder()是将ViewHolder绑定到RecycleView上面时调用的方法
可在这里做更新View的操作。
3) [endif]GetItemCount 方法为返回数据长度的方法。一般返回值为:
return XXX.size();
4) [endif]在adapter中创建一个viewHolder,继承
RecyclerView.ViewHolder
在这里创建item布局中的控件对象,在public ViewHolder(View itemView)
方法中初始化:
tvItem2 = itemView.findViewById(R.id. tv_item_2 );
6. 在adapter 中创建一个数据对象用来接收想要传入的数据,在结构体中接收传入的数据例如:
private List mData;
在Activity中的操作
1. [endif]创建recycleView对象,创建layoutManager(布局管理器)对象,创建adapter对象,创建数据对象
2. 实例化recycleView对象,layoutManager对象,adapter对象
RecycleView有几种布局管理器可用,可实现线性,网格,以及瀑布流的界面,以下为线性布局:
mlayoutManager = new LinearLayoutManager(this);
以下为网格布局:
//mlayoutManager = new GridLayoutManager(this,3,GridLayoutManager.HORIZONTAL,false);
3.为recycleview 设置布局管理器:
viewRecy2.setLayoutManager(mlayoutManager);
4.为recycleview设置adapter:
//3 设置数据适配器viewRecy2.setAdapter(myAdapter);
如果要在每一个item中添加事件,采取事件回调的方法,其他自定义View的回调皆类似,以下以添加点击事件为例:
1) 在adapter中添加点击事件的接口,并添加接口方法:
public interface onItemClickListener { void onItemClick(View view, int position);}
2) [endif]在adapter中创建接口实例
private onItemClickListener onItemClickListener;
3) 在adapter创建对应set方法体来接收Activity传入的对象
public void setOnItemClickListener(onItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener;}
4)在onbindViewholde中判断是否设置了监听器
if (onItemClickListener !=null) {
//为ItemView设置监听器
holder.tvItem2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position =holder.getLayoutPosition();
onItemClickListener.onItemClick(holder.tvItem2, position);
//onItemClickListener.onItemClick();
}
});
}
}
5) 最后在activity中通过adapter对象调用onset方法,实现点击事件
myAdapter.setOnItemClickListener(new MyAdapter.onItemClickListener() {
@Override
public void onItemClick(View view, int position) {
lastPosition =currentPosition;
currentPosition = position;
// Toast.makeText(RecycleActivity_2.this, "click+" + position, Toast.LENGTH_SHORT).show();
myAdapter.notifyItemChanged(currentPosition);
myAdapter.notifyItemChanged(lastPosition);
}
});
Android TV中RecycleView的Item循环实现
(1) 在TV中遥控器的按键取代了手机的滑动,因此我们要监听遥控器的按键,因此在adapter中的item监听setonkeylistener方法。
并获取item所在位置的position,存到tag里面
holder.tvItem2.setTag(position);
当在第一个Item中按向上键时,position<0,此时我们调用移动到最后一个,同理,当在最后一个时,移动到第一个。
smoothScrollToPosition(getItemCount() - 1)
holder.tvItem2.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
int action = event.getAction();
// Log.e("---", keyCode + "");
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
int positionUp = (int) v.getTag();
if (action == KeyEvent.ACTION_DOWN) {
if (positionUp <=0) {
recyclerView.smoothScrollToPosition(getItemCount() -1);
return true;
}
}
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
int positionDown = (int) v.getTag();
if (action == KeyEvent.ACTION_DOWN) {
if (positionDown >= getItemCount() -1) {
recyclerView.smoothScrollToPosition(0);
return true;
}
}
break;
}
return false;
}
});
(2) 然后在activity中封装了一个回滚方法来判断按键是否到达底部,并重新获取焦点
public void scroolChange(RecyclerView recyclerView, boolean toFirst, boolean toLast) {
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int lastVisibleItem = manager.();
int firstVisibleItem = manager.();
int totalItemCount = manager.getItemCount();
//向下滚动,到底部
if (lastVisibleItem == (totalItemCount -1) && toLast) {
View view = recyclerView.getChildAt(lastVisibleItem);
LinearLayoutManager llM = (LinearLayoutManager) recyclerView.getLayoutManager();
if (view !=null) {
view.requestFocus();
}else if (llM.findViewByPosition(lastVisibleItem) !=null) {
llM.findViewByPosition(lastVisibleItem).requestFocus();
}else {
recyclerView.requestFocus();
}
}
//向上滚动,到顶部
if (firstVisibleItem ==0 && toFirst) {
View view = recyclerView.getChildAt(firstVisibleItem);
LinearLayoutManager llM = (LinearLayoutManager) recyclerView.getLayoutManager();
if (view !=null) {
view.requestFocus();
}else if (llM.findViewByPosition(firstVisibleItem) !=null) {
llM.findViewByPosition(firstVisibleItem).requestFocus();
}else {
recyclerView.requestFocus();
}
}
}
(3) 最后在recycleView 调用addscrolllistener方法,来监听recycleView的滚动状态
由于setonScrollListener有时回产生空指针,因此建议使用add方法
viewRecy2.addOnScrollListener(new RecyclerView.OnScrollListener() {
boolean toLast =false;
boolean toFirst =false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == recyclerView.SCROLL_STATE_IDLE) {
// Log.e("---", "底部");
scroolChange(recyclerView, toFirst, toLast);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy >0) {
toLast =true;
}else {
toFirst =true;
}
}
});
Add中包含两个方法,都可以来判断是否到达顶部或底部。至此,实现了Android TV中RecycleView的循环功能。
③ android开发图片(ImageView)要实现循环匀速滚动,速度可调,怎么实现呢,用什么组件好呢
采用画廊视图,GalleryView,自动匀速定时切换的话可以使用Timetask。网上搜一搜,很多案例。望采纳。
④ 在android系统 里的 gallery什么意思啊
android系统里的“gallery”指的是图库相册。
gallery 表示:n. 画廊;走廊;旁听席;地道;vt. 在?修建走廊;在?挖地道;vi. 挖地道
相关短语
1、art gallery美术馆;画廊
2、photo gallery图片库
3、picture gallery画馆;美术馆
(4)androidgallery循环扩展阅读:
近义词:n. 画廊;走廊;旁听席;地道 hall、passage、corridor、underground、subway
gallery 来自拉丁语Galilaea, 现巴勒斯坦地名Galilee,原指位于Galilee的教堂门廊,走廊。
双语例句
1、Beforewego tothegallery.
在我们去画廊之前。
2、Isthisyourgallery?
这是你的画廊吗?
3、Sowhat diddadhave todo at thegallery.
那么其实爸爸要去画廊做什么?
⑤ Android RecyclerView实现循环列表-点击事件
源码链接
效果图
实现步骤:
1.在build.gradle文件中加入recyclerView库
2.在main.xml中使用recyclerView布局
3.滚动列表中的每一项对应一个对象,他们属于同一类的实例。接着定义实体类,我做的是歌单列表,定义序号,名字和时长
4.设计列表项的样式
4.使用适配器为列表项设置显示的数据
4.1定义适配器的内部类与列表项绑定
4.2适配器继承自recyclerView.Adapter,要重写三个方法,创建列表项视图,复用加载,获取列表项数量,到这一步,循环列表已经可以实现滚动效果了。
5.为列表项添加点击监听事件,使用接口回调
5.1仍然是在适配器中,定义接口
5.2在onBindViewHolder中为列表项设置监听
5.3在MainActivity中使用,实现onclick方法
⑥ 安卓系统桌面循环滚动桌面设置的
1、手机设置”的“辅助功能”中有选择是否“桌面循环”。
2、在原生的android源码上添加这一功能。
思路:先把界面做出来,再将是否选择的值存到系统的(adb shell进入)data/data/com.android.providers.settings/databases/settings.db数据库中的system表中,
然后在Launch2的源码中取得数据库中是否选择循环桌面来执行相关代码。
先做UI:
在settings源码中的accessibility_settings.xml文件中添加一个checkbox:
java代码
android:key="launch_repeat"
android:title="@string/launch_repeat_title"
android:persistent="false"/>
在settings源码的res中添加相关的代码:
在values/string.xml中添加(英文显示):
Launch Repeat
在values-zh-rCN/string.xml中添加(中文显示):
"循环桌面"
在settings源码的AccessibilitySettings.java中的OnCreate中添加:
java代码
/*****************************************/
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函数中添加:
java代码
//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中,之前有修改循环,如下:
java代码
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,就不能。
代码修改如下:
java代码
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就可以了。