本程序主要实现了:

1.使用AssetManager将assets目录中的文件复制到SD卡的指定位置

2.使用AlarmManager全局定时器,周期性的启动指定组件切换壁纸

3.使用SharedPreferences,将用户个性化的设置保存到手机(例如壁纸切换频率)

4.使用自定义标题栏

5.使用了GestureDetector手势检测器,允许用户滑动切屏

6.使用了overridePendingTransition,在切屏的时候有动画效果

程序运行效果图:

程序代码:

ChangeWallpaper.java:

package com.jph.changewallpaper;import java.io.File;
import com.jph.util.Const;
import com.jph.util.CopyFolder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ToggleButton;
/*** Describe:</br>* </br>帮你换壁纸* </br>本程序主要实现了:* </br>1.使用AssetManager将assets目录中的文件复制到SD卡的指定位置* </br>2.使用AlarmManager全局定时器,周期性的启动指定组件切换壁纸* </br>3.使用SharedPreferences,将用户个性化的设置保存到手机(例如壁纸切换频率)* </br>4.使用自定义标题栏* </br>5.使用了GestureDetector手势检测器,允许用户滑动切屏* </br>6.使用了overridePendingTransition,在切屏的时候有动画效果* </br>@author jph* </br>Date:2014.08.05 * * */
public class ChangeWallpaper extends Activity implements OnGestureListener{ //定义手势检测器实例GestureDetector detector;// 定义AlarmManager对象AlarmManager alarmManager;ToggleButton btnSwitch;    ImageButton btnSetting;Intent intent;PendingIntent pi;//表示是不是第一次使用该应用boolean isFirstUse;//是不开启了自动切换壁纸boolean isLaunch;//壁纸切换别的频率int frequency;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置自定义标题栏标志  ,该语句必须放在setContentView之前requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);  setContentView(R.layout.main);//设置自定义标题栏,改句必须放在setContentView之后  getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);        btnSwitch=(ToggleButton)findViewById(R.id.btnSwitch);btnSetting=(ImageButton)findViewById(R.id.btnSetting);btnSetting.setOnClickListener(listener);//初始化手势检测器detector=new GestureDetector(this,this);// 指定启动ChangeService组件intent = new Intent(ChangeWallpaper.this,ChangeService.class);// 创建PendingIntent对象pi=PendingIntent.getService(ChangeWallpaper.this, 0, intent, 0);      //获取系统的AlarmManager对象alarmManager=(AlarmManager)getSystemService(Service.ALARM_SERVICE);//初始化程序配置iniApp();btnSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {         @Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {// TODO Auto-generated method stub        isLaunch=isChecked;if (isChecked) {                    launchChangeService();  }else {// 取消对pi的调度alarmManager.cancel(pi);}}});}//启动切换壁纸protected void launchChangeService() {// TODO Auto-generated method stub                            // 设置每隔5秒执行pi代表的组件一次alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 0, frequency, pi);Toast.makeText(ChangeWallpaper.this, "壁纸定时更换启动成功啦",Toast.LENGTH_SHORT).show();}OnClickListener listener=new OnClickListener() {     @Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.btnSetting:showSetting();break;default:break;}}};//初始化应用,如果第一次使用,则将asset下的壁纸拷贝到SD卡上private void iniApp() {// TODO Auto-generated method stub//获取系统的SharedPreferences对象SharedPreferences preferences=getSharedPreferences("config", MODE_PRIVATE);//获取配置文件中的isFirstUseisFirstUse=preferences.getBoolean("isFirstUse", true);//获取配置文件中的frequency切换频率,默认五秒frequency=preferences.getInt(Const.SETING_FREQUENCY_Str, 5000);       if (isFirstUse) {//如果第一次使用,则将asset下的壁纸拷贝到SD卡上//如果手机插入了SD卡,且程序有读取SD卡的权限if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取手机SD卡的目录File sdCardDir=Environment.getExternalStorageDirectory();String path=null;try {path=sdCardDir.getCanonicalPath()+File.separator+"wallpaper";} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}CopyFolder cf=new CopyFolder(ChangeWallpaper.this, "wpics", path);cf.start();//启动线程               }}}//显示程序设置界面protected void showSetting() {// TODO Auto-generated method stub//启动设置界面Intent intent=new Intent(ChangeWallpaper.this, SettingActivity.class);startActivityForResult(intent,Const.REQUESTCODE_FOR_SETTING);//设置切换动画,从右边进入,左边退出overridePendingTransition(R.anim.right_in, R.anim.left_out);} @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubswitch (requestCode) {case Const.REQUESTCODE_FOR_SETTING://如果从设置界面返回if (isLaunch) {//如果已经启动了自动且换壁纸//获取配置信息iniApp();launchChangeService();}           break;default:break;}}  @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubswitch (keyCode) {case KeyEvent.KEYCODE_MENU://当按下菜单键跳转到设置界面showSetting();break;default:break;}return super.onKeyDown(keyCode, event);       }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.change_wallpaper, menu);return true;}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stub//将触碰事件交给GestureDetector处理return detector.onTouchEvent(event);}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stub//如果想右滑动的距离大于50mmif (e1.getX()-e2.getX()>50) {showSetting();         }return false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}
}

ChangeService.java(ChangeService切换壁纸类):

package com.jph.changewallpaper;import java.io.File;
import java.util.ArrayList;
import com.jph.util.CopyFolder;
import android.app.Service;
import android.app.WallpaperManager;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.IBinder;
import android.widget.Toast;
/*** Describe:</br>* </br>ChangeService切换壁纸类* </br>获取SD卡的指定指定目录下的图片* </br>使用WallpaperManager来更换当前壁纸* </br>@author jph* </br>Date:2014.08.05 * * */
public class ChangeService extends Service {//定义一个存放图片名的数组String []fileNames;//定义一个存放图片路径的集合ArrayList<String>picPaths=new ArrayList<String>(); // 定义系统的壁纸管理服务WallpaperManager wManager;// 定义当前所显示的壁纸int current = 0,flag=0;//创建一个CopyFolder类的对象CopyFolder cf=null;  public ChangeService() {// TODO Auto-generated constructor stubsuper();}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();//初始化WallpaperManagerwManager = WallpaperManager.getInstance(this);       if (picPaths.isEmpty()) {//如果picPaths中还没有照片getPicPath();}flag++;Toast.makeText(ChangeService.this, "flag:"+flag,Toast.LENGTH_SHORT).show();System.out.println("==========================");System.out.println( "flag:"+flag);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubSystem.out.println("==========================");System.out.println( "onStartCommand:"+flag);// 如果到了最后一张,系统重新开始if(current >picPaths.size())current = 0;try{//将指定路径的图片转换成bitmapBitmap bitmap=BitmapFactory.decodeFile(picPaths.get(current++).toString());// 改变壁纸wManager.setBitmap(bitmap);}catch (Exception e){e.printStackTrace();}return START_STICKY; }   //从SD卡的根目录下的wallpaper文件夹中读出图片路径到picPaths集合中public void getPicPath(){    System.out.println("==========================");System.out.println( "getPicPath:"+flag);//如果手机插入了SD卡,且程序有读取SD卡的权限if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取手机SD卡的目录File sdCardDir=Environment.getExternalStorageDirectory();String path=null;try {path=sdCardDir.getCanonicalPath()+File.separator+"wallpaper";} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}File file=new File(path);fileNames=file.list();//如果wallpaper目录不存在或为空则将assets目录下的壁纸复制到wallpaper目录下          if (fileNames==null||fileNames.length==0) {     if (cf==null) {cf=new CopyFolder(ChangeService.this, "wpics", path);cf.start();//启动线程                      }   }picPaths.clear();//清空集合中的数据for (String picName:fileNames) {if (isPicture(picName)) {//将图片的完整路径添加到picPaths中picPaths.add(path+File.separator+picName);}                }}}/*** 判断文件类型是否为图片* @param fileName String 用于判断的文件名* @return boolean* */public boolean isPicture(String fileName) {//存放图片格式的数组String []limit=new String[]{".png",".jpg",".gif",".jpeg" +".bmp",".PNG",".JPG",".GIF",".JPEG",".BMP"};for (String str:limit) {if (fileName.endsWith(str)) {//如果指定文件名为以上其中一种格式则返回truereturn true;}}return false;}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}
}

SettingActivity.java(设置菜单界面类)

package com.jph.changewallpaper;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jph.util.Const;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.GestureDetector.OnGestureListener;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleAdapter;
/*** Describe:</br>* </br>设置菜单界面类* </br>将用户个性化的设置保存到SharedPreferences中* </br>@author jph* </br>Date:2014.08.05 * */
public class SettingActivity extends Activity implements OnGestureListener{private AlertDialog dialog;private AlertDialog.Builder builder;ListView list;//设置菜单标题String []itemTitles;//设置菜单图标int []itemIcos;//壁纸切换频率String frequencyString;//定义手势检测器实例       GestureDetector detector;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.setting);//初始化手势检测器detector=new GestureDetector(this,this);list=(ListView)findViewById(R.id.list);//初始化ListViewinitList();}private void initList() {// TODO Auto-generated method stub//获取itemTitles.xml中的选项标题和图标itemTitles=getResources().getStringArray(R.array.itemTitles);itemIcos=new int[]{R.drawable.setting_fre,R.drawable.setting_fs,R.drawable.setting_redefault,R.drawable.setting_abuot};List<Map<String,Object>>listItems=new ArrayList<Map<String,Object>>();for (int i = 0; i < itemTitles.length; i++) {Map<String, Object>listItem=new HashMap<String, Object>();listItem.put("imgItemIco", itemIcos[i]);listItem.put("txtItemTitle", itemTitles[i]);listItems.add(listItem);}SimpleAdapter adapter=new SimpleAdapter(SettingActivity.this,listItems,R.layout.line, new String[]{"imgItemIco","txtItemTitle"},new int[]{R.id.imgItemIco,R.id.txtItemTitle});list.setAdapter(adapter);list.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {// TODO Auto-generated method stubswitch (position) {case 0://设置壁纸切换的屏幕setFrequency();break;case 1:displayPattern();break;case 2:break;case 3:about();                   break;default:break;}}});       }//设置壁纸的显示方式protected void displayPattern() {// TODO Auto-generated method stubfinal String item[]=new String[]{"平铺","拉伸","裁切","默认"};DialogInterface.OnClickListener sListener=new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {frequencyString=item[which];               }};builder=new AlertDialog.Builder(this);builder.setSingleChoiceItems(item, -1, sListener);dialog=builder.create();dialog.setTitle("请设置壁纸显示方式");//创建按键监听器DialogInterface.OnClickListener listener=new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {if(which==DialogInterface.BUTTON_POSITIVE){//按下确定dialog.dismiss();if (frequencyString.endsWith("秒")) {frequencyString=frequencyString.replace("秒", "");//将String转换成intint frequency=Integer.parseInt(frequencyString)*1000;alterConfig(Const.SETING_FREQUENCY,frequency);}else if (frequencyString.endsWith("分钟")) {frequencyString=frequencyString.replace("分钟", "");//将String转换成intint frequency=Integer.parseInt(frequencyString)*1000*60;alterConfig(Const.SETING_FREQUENCY,frequency);}}else if(which==DialogInterface.BUTTON_NEGATIVE){//按下取消dialog.dismiss();}}};dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",listener);dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",listener);        dialog.show();}//关于protected void about() {// TODO Auto-generated method stubLayoutInflater inflater=LayoutInflater.from(this);LinearLayout layout=(LinearLayout) inflater.inflate(R.layout.about, null);AlertDialog dialog=new AlertDialog.Builder(SettingActivity.this).create();dialog.setTitle("关于");dialog.setIcon(R.drawable.smile);dialog.setView(layout);dialog.show();}//设置显示频率protected void setFrequency() {// TODO Auto-generated method stubfinal String item[]=new String[]{"3秒","5秒","10秒","20秒","30秒","1分钟","5分钟","10分钟"};DialogInterface.OnClickListener sListener=new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {frequencyString=item[which];             }};builder=new AlertDialog.Builder(this);builder.setSingleChoiceItems(item, -1, sListener);dialog=builder.create();dialog.setTitle("请设置壁纸切换的频率");//创建按键监听器DialogInterface.OnClickListener listener=new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {if(which==DialogInterface.BUTTON_POSITIVE){//按下确定dialog.dismiss();if (frequencyString.endsWith("秒")) {frequencyString=frequencyString.replace("秒", "");//将String转换成intint frequency=Integer.parseInt(frequencyString)*1000;alterConfig(Const.SETING_FREQUENCY,frequency);}else if (frequencyString.endsWith("分钟")) {frequencyString=frequencyString.replace("分钟", "");//将String转换成intint frequency=Integer.parseInt(frequencyString)*1000*60;alterConfig(Const.SETING_FREQUENCY,frequency);}}else if(which==DialogInterface.BUTTON_NEGATIVE){//按下取消dialog.dismiss();}}};dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",listener);dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",listener);       dialog.show();}//修改配置文件protected void alterConfig(int flag, int frequency) {// TODO Auto-generated method stubSharedPreferences preferences=getSharedPreferences("config", MODE_PRIVATE);//获取SharedPreferences对应的EditorEditor editor=preferences.edit();switch (flag) {case Const.SETING_FREQUENCY:editor.putInt(Const.SETING_FREQUENCY_Str, frequency);break;default:break;}editor.commit();}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stub//将触碰事件交给GestureDetector处理return detector.onTouchEvent(event);}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stub//如果向左滑动距离大于50mmif (e2.getX()-e1.getX()>50) {Intent intent=getIntent();setResult(Activity.RESULT_OK, intent);this.finish();overridePendingTransition(R.anim.left_in, R.anim.right_out);}return false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}}

工具类:

CopyFolder.java(复制assets中的文件到SD卡的指定位置)

package com.jph.util;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
/*** Describe:</br>* </br>从assets项目目录中复制文件及目录* </br>本类启用了一个新线程用于处理复制文件的耗时任务* </br>当所有的复制完成或复制文件出错时通知UI线程* </br>@author JPH* </br>Date:2014.07.30* */
public class CopyFolder extends Thread {//定义两个常量用于表示复制文件成功的标识public final static int COPY_FALSE=0x123,COPY_SUCCESS=0x456;String newPath,oldPath;Context context;public CopyFolder() {// TODO Auto-generated constructor stub}/**  *  从assets目录中复制整个文件夹内容  *  @param  context  Context 使用CopyFiles类的Activity*  @param  oldPath  String  原文件路径  如:img  *  @param  newPath  String  复制后路径  如:xx:/bb/cc  */ public CopyFolder(Context context,String oldPath,String newPath) {this.context=context;this.oldPath=oldPath;this.newPath=newPath;     }@Overridepublic void run() {// TODO Auto-generated method stubcopyFilesFassets(context,oldPath,newPath);SharedPreferences prference=context.getSharedPreferences("config", Context.MODE_PRIVATE);Editor editor=prference.edit();editor.putBoolean("isFirstUse", false);//写入使用标识editor.commit();//最后不要忘记将存入的数据进行提交
//      MainActivity.handler.sendEmptyMessage(COPY_SUCCESS);}
/**  *  从assets目录中复制整个文件夹内容  *  @param  context  Context 使用CopyFiles类的Activity*  @param  oldPath  String  原文件路径  如:/aa  *  @param  newPath  String  复制后路径  如:xx:/bb/cc  */
public void copyFilesFassets(Context context,String oldPath,String newPath) {           try {String fileNames[] = context.getAssets().list(oldPath);//获取assets目录下的所有文件及目录名if (fileNames.length > 0) {//如果是目录File file = new File(newPath);file.mkdirs();//如果文件夹不存在,则递归for (String fileName : fileNames) {copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);}} else {//如果是文件InputStream is = context.getAssets().open(oldPath);FileOutputStream fos = new FileOutputStream(new File(newPath));byte[] buffer = new byte[1024];int byteCount=0;                while((byteCount=is.read(buffer))!=-1) {//循环从输入流读取 buffer字节         fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流}fos.flush();//刷新缓冲区is.close();fos.close();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();//如果捕捉到错误则通知UI线程
//      MainActivity.handler.sendEmptyMessage(COPY_FALSE);}
}
}

Const.java(常量类:提供程序中用到的主要常量)

package com.jph.util;
/*** Describe:</br>* </br>常量类* </br>提供程序中用到的主要常量* </br>@author jph* </br>Date:2014.08.05 * */
public class Const {//壁纸切换频率标识public final static int SETING_FREQUENCY=0x0001; public final static String SETING_FREQUENCY_Str="frequency";//SettingActivity的请求码public final static int REQUESTCODE_FOR_SETTING=0x123;public Const() {// TODO Auto-generated constructor stub}}

AndroidManifest.xml配置清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.jph.changewallpaper"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="18" /><!-- 在SD卡中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 向SD卡写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 授予用户修改壁纸的权限 --><uses-permission android:name="android.permission.SET_WALLPAPER" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.jph.changewallpaper.ChangeWallpaper"android:label="@string/app_name" android:theme="@style/style_title"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name="com.jph.changewallpaper.SettingActivity"></activity><!-- 注册 ChangeService--><service android:name="com.jph.changewallpaper.ChangeService"></service></application></manifest>

Android开发之自动更换壁纸相关推荐

  1. android 通过service 执行AlarmManager 自动更换壁纸

    自动更换壁纸是通过服务在后台进行的,所以 新建一个类继承service服务 先附上详细的解析代码: package com.example.changebz; import java.io.IOExc ...

  2. android 自动更换壁纸,安卓壁纸如何设置自动更换壁纸-手机天堂

    安卓壁纸是一款非常实用的手机壁纸更换软件,平台中有非常丰富的静态壁纸和视频动态壁纸,可以说是每天换一张都不会重样的,这就让手机变的更加的丰富多彩.相信有不少的朋友会认为老使用一张壁纸太单调,每天都换成 ...

  3. android 自动更换壁纸,超简单实用!教你安卓自动更换壁纸的方法

    爱美不只是女人的天性,喜新厌旧也算不上什么坏毛病.尤其如今手机分辨率越来越高.色彩表现也愈发给力,要是不给手机时不时换个高端大气上档次的壁纸,都对不起那块高科技屏幕.所以今天给大家带来安卓自动更换壁纸 ...

  4. Android开发实例-自动生成题库的数独

    本系列文章主要介绍如何利用Android开发一个自动生成题目的数独游戏.涉及的知识和技术如下所示: 挖洞算法自动生成数独题目实现自定义View用于绘制数独盘数据库的基本操作 看着市场上千篇一律的数独应 ...

  5. python修改桌面壁纸_利用Python对windows桌面自动更换壁纸

    根据时间星期几判断用哪张壁纸 # !/usr/bin/env python3 # -*- coding:utf-8 -*- import requests # import pywintypes im ...

  6. linux设置自动更换壁纸

    #!/bin/bash let n=0 files=($HOME/wallpapers/*.jpg) count=${#files[@]} while [ 1 ] dolet "n=n%$c ...

  7. linux 壁纸自动更换,使用LSWC在Linux中自动更换壁纸

    本文将为你介绍安装及使用LittleSimpleWallpaperChanger(LSWC)小脚本为你的Linux桌面定期自动更换壁纸.如果你不再使用LSWC,还可以使用本文介绍的删除方法处理. 其实 ...

  8. 让 Ubuntu 桌面自动更换壁纸

    让 Ubuntu 桌面自动更换壁纸 Posted on 2016-07-10 22:56 京山游侠 阅读(4256) 评论(10) 编辑 收藏 引言 让我们的桌面系统自动更换壁纸是一个很常见的美化需求 ...

  9. 自动更换壁纸软件 Bing Wallpaper

    喜欢每天看到不一样电脑壁纸的用户们可以看过来了哦,Bing Wallpaper(必应壁纸工具)是微软官方出品的一款专门用来更新必应壁纸加粗样式的软件,可以实现壁纸每日一图自动更新,而且占用内存非常小, ...

最新文章

  1. 简单的dns解析过程
  2. centos7配置静态IP
  3. 二手轻型载货车报价图片_别买贵了,老陈带你走进二手iPhone的大本营:深圳飞扬市场...
  4. JAVA程序员面试必知32个知识点
  5. 兼容CSS性技巧大全
  6. PHP基础--PDO的常用操作
  7. C++ 智能指针shared_ptr、weak_ptr的简单实现
  8. 地图客户端自动化测试
  9. java模拟刷百度排名无效_刷百度排名软件教程-软件设置问题
  10. 用javascript实现九九乘法口诀表
  11. 阿里云盘PC端内测版可以下载安装了 还送你800G扩容福利码!
  12. ViewData与ViewBag的区别与联系
  13. linux 无线网络连接不上网,linux无法连接wifi,不显示wifi
  14. Gartner发布首份中国RPA魔力象限报告,弘玑Cyclone被重点推荐
  15. 某程序员动了公司祖传代码屎山,半年没改完,惭愧后交辞职报告
  16. python三剑客是什么意思_python数据分析三剑客之: Numpy
  17. c/c++基于liunx平台tcp协议通信分数据段发送小demo
  18. 【RDMA】ibv_poll_cq()
  19. 在win7下配置Geany,使其使用 Python 3
  20. GDB调试-从入门实践到原理

热门文章

  1. 2022年沈阳市施工员(装修装饰)考试练习题及答案
  2. 数字图像处理 - Ch3 锐化(高通)空间滤波器
  3. 「Adobe国际认证」关于Photoshop选择并遮住工作区,用户界面介绍
  4. win10系统怎么把python卸载干净_Win10系统卸载python软件失败提示0x
  5. C# DES解密异常问题
  6. 【Physiol Plant】转录因子PpybZIP43通过激活PpySPS3表达和与PpySTOP1互作从而促进梨果实蔗糖合成
  7. 威联通使用Typecho搭建博客
  8. 记录手机root后安装xposed框架后变砖无法开机的问题
  9. poj1606 Jugs(BFS)
  10. 服务器虚拟化用什么显卡,显卡虚拟化使用及配置技术