此篇根据上篇代码改进,仅作娱乐!!!!!

参见:使用SurfaceView实现系统信息显示

LiveWallpaperService.java

public class LiveWallpaperService extends WallpaperService{@Overridepublic WallpaperService.Engine onCreateEngine() {return new WallpaperEngine();}
//public class WallpaperEngine extends Engine{private Handler mHandler = new Handler();private DrawThread mDrawThread;public WallpaperEngine(){}@Overridepublic void onCreate(SurfaceHolder surfaceHolder) {super.onCreate(surfaceHolder);setTouchEventsEnabled(true);mDrawThread = new DrawThread(LiveWallpaperService.this,getSurfaceHolder());mDrawThread.start();}@Overridepublic void onDestroy() {super.onDestroy();mDrawThread.stopThread();}@Overridepublic void onVisibilityChanged(boolean visible) {//mVisible = visible;}}
}
SystemInfo.java
public class SystemInfo {public final String Product = android.os.Build.PRODUCT;public final String CPU_ABI = android.os.Build.CPU_ABI;public final String TAGS = android.os.Build.TAGS;public final int VERSION_CODES_BASE = android.os.Build.VERSION_CODES.BASE;public final String MODEL = android.os.Build.MODEL;//public final String SDK = android.os.Build.VERSION.SDK;public final String VERSION_RELEASE = android.os.Build.VERSION.RELEASE;public final String DEVICE = android.os.Build.DEVICE;public final String DISPLAY = android.os.Build.DISPLAY;public final String BRAND = android.os.Build.BRAND;public final String BOARD = android.os.Build.BOARD;public final String FINGERPRINT = android.os.Build.FINGERPRINT;public final String ID = android.os.Build.ID;public final String MANUFACTURER = android.os.Build.MANUFACTURER;public final String USER = android.os.Build.USER;private final static float perSIZE = 1024.0f;private String[] mCpuInfo = null;private float mBattery = 0.0f;private Context mContext;public SystemInfo(Context c){c.registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));mContext = c;mCpuInfo = getCpuInfo();}public final long getMemByString(String line, String find){Pattern pattern = Pattern.compile(find);Matcher matcher = pattern.matcher(line);if (!matcher.find()) {return 0;}pattern = Pattern.compile("[^0-9]");matcher = pattern.matcher(line);return Long.decode(matcher.replaceAll(""));}public long[] getRamMemory() {long[] l = new long[2];String str1 = null;long MemTotal, MemFree, Buffers, Cached;try {FileReader fr = new FileReader("/proc/meminfo");//第一行是总内存大小(即用户可以使用的ram的大小)BufferedReader localBufferedReader = new BufferedReader(fr, 8192);str1 = localBufferedReader.readLine();MemTotal = getMemByString(str1,"^MemTotal:");str1 = localBufferedReader.readLine();MemFree = getMemByString(str1,"^MemFree:");str1 = localBufferedReader.readLine();Buffers = getMemByString(str1,"^Buffers:");str1 = localBufferedReader.readLine();Cached = getMemByString(str1,"^Cached:");l[0] = MemTotal;//对于应用程序来说,buffers/cached 是等于可用的,// 因为buffer/cached是为了提高文件读取的性能,// 当应用程序需在用到内存的时候,buffer/cached会很快地被回收l[1] = MemFree + Buffers + Cached;} catch (IOException e) {e.printStackTrace();}return l;}//Available rom memorypublic long getAvailInternalMemorySize() {File path = Environment.getDataDirectory();StatFs stat = new StatFs(path.getPath());long blockSize = stat.getBlockSize();long availableBlocks = stat.getAvailableBlocks();return blockSize * availableBlocks;}//Total rom memorypublic long getTotalInternalMemorySize() {File path = Environment.getDataDirectory();StatFs stat = new StatFs(path.getPath());long blockSize = stat.getBlockSize();long totalBlocks = stat.getBlockCount();return totalBlocks * blockSize;}//sdCard大小public long[] getSDCardMemory() {long[] sdCardInfo=new long[2];String state = Environment.getExternalStorageState();if (Environment.MEDIA_MOUNTED.equals(state)) {File sdcardDir = Environment.getExternalStorageDirectory();StatFs sf = new StatFs(sdcardDir.getPath());long bSize = sf.getBlockSize();long bCount = sf.getBlockCount();long availBlocks = sf.getAvailableBlocks();sdCardInfo[0] = bSize * bCount;//总大小sdCardInfo[1] = bSize * availBlocks;//可用大小}return sdCardInfo;}//电池电量private BroadcastReceiver batteryReceiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {int level = intent.getIntExtra("level", 0);int scale = intent.getIntExtra("scale",100);mBattery = (float)level / (float) scale;//    level加%就是当前电量了}};public float getBattery(){return mBattery;}//CPU信息public String[] getCpuInfo() {if(null == mCpuInfo){String str="";mCpuInfo = new String[1];try {FileReader fr = new FileReader("/proc/cpuinfo");BufferedReader localBufferedReader = new BufferedReader(fr, 8192);str = localBufferedReader.readLine();mCpuInfo[0] = str.substring(str.indexOf(':')+1).trim();//Log.d("zw","CPUInfoMatcher = "+cpuInfo[0]);} catch (IOException e) {}}return mCpuInfo;}//MAC地址和/*public String[] getOtherInfo(){String[] other={"null","null"};WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);WifiInfo wifiInfo = wifiManager.getConnectionInfo();if(wifiInfo.getMacAddress()!=null){other[0]=wifiInfo.getMacAddress();} else {other[0] = "Fail";}other[1] = getTimes();return other;}*///开机时间private String getStartTimes() {long ut = SystemClock.elapsedRealtime() / 1000;if (ut == 0) {ut = 1;}//int s = (int)(ut % 60);int m = (int) ((ut / 60) % 60);int h = (int) ((ut / 3600));return h + ":" + m;}public String[] getSystemInfo(){String list[] = new String[9];list[0] = Product + " " + MODEL;list[1] = "CPU info-->" + getCpuInfo()[0];list[2] = "Start time:" + getStartTimes();long[] mem = getRamMemory();list[3] = "Total RAM: " + fromKBToMB(mem[0]) + "MB";list[4] = "Avail RAM: " + fromKBToMB(mem[1]) + "MB";list[5] = "Total ROM: " + fromBtyeToMB(getTotalInternalMemorySize()) + "MB";list[6] = "Avail ROM: " + fromBtyeToMB(getAvailInternalMemorySize()) + "MB";mem = getSDCardMemory();list[7] = "Total SD: " + fromBtyeToMB(mem[0]) + "MB";list[8] = "Avail SD: " + fromBtyeToMB(mem[1]) + "MB";return list;}public final static String fromKBToMB(long l){return String.format("%1$.2f",(l / perSIZE));//保留小数点后两位}public final static String fromBtyeToMB(long l){return String.format("%1$.2f",(l / perSIZE / perSIZE));//保留小数点后两位}private static class ShellExecute {private static final int top_info = 500;// top命令public static final String[] TOP = { "/system/bin/top", "-n" ,"1"};//运行一次// CPU使用情况public static synchronized String[] run(String[] cmd) {String[] lines = new String[top_info];InputStream is = null;BufferedReader buf = null;try {Runtime runtime = Runtime.getRuntime();Process proc = runtime.exec(cmd);is = proc.getInputStream();// 换成BufferedReaderbuf = new BufferedReader(new InputStreamReader(is));for(int i = 0;i < top_info;){lines[i] = buf.readLine();if(null == lines[i]){break;}if(lines[i].trim().equals("")){continue;}i ++;}if (is != null) {buf.close();is.close();}} catch (IOException e) {e.printStackTrace();}return lines;}}
}

DrawThread.java

public class DrawThread extends Thread{private SurfaceHolder mSurfaceHolder;private SystemInfo mSystemInfo;private Context mContext;private Boolean mRunning;private Boolean mHanging;private String[] leftText = null;private int lefttext_index = 0;private int lefttext_num = 0;public DrawThread(Context c,SurfaceHolder s){mContext = c;mSurfaceHolder = s;mSystemInfo = new SystemInfo(c);mRunning = true;mHanging = false;}public void stopThread(){mRunning = false;}public void hangThread(){mHanging = true;}public void liveThread(){if(mRunning){mHanging = false;synchronized (mHanging){mHanging.notify();}}else{mRunning = true;mHanging = false;this.start();}}@Overridepublic void run() {while (mRunning){Canvas canvas = null;try{canvas = mSurfaceHolder.lockCanvas(null);//获取画布if(null == canvas)continue;synchronized (mSurfaceHolder){doDraw(canvas);}mSurfaceHolder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像}catch (IllegalArgumentException e){e.printStackTrace();}synchronized (mHanging){if(mHanging){try {/** synchronized (b){...};的意思是定义一个同步块,* 使用b作为资源锁。b.wait();的意思是临时释放锁,* 并阻塞当前线程,好让其他使用同一把锁的线程有机* 会执行,在这里要用同一把锁的就是b线程本身.这个* 线程在执行到一定地方后用notify()通知wait的线程,* 锁已经用完,待notify()所在的同步块运行完之后,wait* 所在的线程就可以继续执行.* */mHanging.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}private void doDraw(Canvas canvas){int h = canvas.getHeight();int w = canvas.getWidth();Bitmap m = BitmapFactory.decodeResource(mContext.getResources(),R.drawable.bg);canvas.drawBitmap(m,0,0,null);drawMoveText(canvas,16,16 + h / 8,5);drawClock(canvas, 16, h / 3, w / 8, mSystemInfo.getBattery());long []l = mSystemInfo.getRamMemory();l[1] = l[0] - l[1];drawProcess(canvas,w / 3,h / 3,w / 3,(float)l[1] / l[0],SystemInfo.fromKBToMB(l[1])+"MB/"+SystemInfo.fromKBToMB(l[0])+"MB");}private void drawClock(Canvas canvas,int startX,int startY,int width,float rate){int centerX = startX + width;int centerY = startY + width;int circleOut = (int)(width * 0.8f);float point = circleOut * 0.8f;canvas.save();Paint paint = new Paint();paint.setAntiAlias(true);paint.setStyle(Paint.Style.STROKE);canvas.translate(centerX, centerY); //将位置移动画纸的坐标点:150,150canvas.drawCircle(0, 0, circleOut, paint); //画圆圈Paint tmpPaint = new Paint(paint);//小刻度画笔对象tmpPaint.setStrokeWidth(1);int count = 10;float t = 360.0f/count;//总刻度数for(int i=1 ; i <= count ; i++){canvas.save();//每次重置,防止累计误差的产生canvas.rotate(t*i,0f,0f); //旋转画纸canvas.drawLine(0f, -circleOut, 0f, -circleOut + 10f, paint);canvas.drawText(String.valueOf(i)+"0%", -8f, -circleOut-12f, tmpPaint);canvas.restore();}//canvas.rotate(180f,0f,0f); //旋转画纸//绘制指针tmpPaint.setColor(Color.YELLOW);tmpPaint.setStrokeWidth(4);canvas.drawCircle(0, 0, 4, tmpPaint);canvas.drawLine(0, 0,point * (float)Math.sin(rate * 2.0d * Math.PI) ,- point * (float)Math.cos(rate * 2.0d * Math.PI) ,paint);Paint textPaint = new Paint();textPaint.setTextSize(30);textPaint.setStrokeWidth(4);textPaint.setColor(Color.BLACK);canvas.drawText(String.valueOf((int)(rate * 100f))+"%", -30f, circleOut+60f, textPaint);canvas.restore();}private void drawMoveText(Canvas canvas,int startX,int startY,int sum_Line){Paint paint = new Paint();int mTextSize = 20;paint.setTextSize(mTextSize);paint.setStrokeWidth(10);paint.setColor(Color.BLACK);if(null == leftText)leftText = mSystemInfo.getSystemInfo();//float sWidth = paint.measureText(leftText[3]);//int sum_line = canvas.getHeight() / mTextSize -25;//在屏幕上显示多少行,除去动态显示int start_num = lefttext_num >= sum_Line ? lefttext_num - sum_Line + 1:0;//从哪一行开始显示int total_num = lefttext_num >= sum_Line ? sum_Line-1:lefttext_num;//需要显示多少行for(int i = 0;i < total_num;i ++){canvas.drawText(leftText[i + start_num],startX,startY+mTextSize*i,paint);}//String s = leftText[lefttext_num].substring(0,lefttext_index);canvas.drawText(leftText[lefttext_num],0,lefttext_index,startX,startY+mTextSize*total_num,paint);lefttext_index ++;if(lefttext_index >= leftText[total_num + start_num].length()){lefttext_index = 0;lefttext_num++;if(lefttext_num >= leftText.length)lefttext_num = 0;}}private void drawProcess(Canvas canvas,int startX,int startY,int width,float rate,String text){int s = 6;Paint tpaint = new Paint();tpaint.setColor(Color.BLUE);tpaint.setStrokeWidth(15);int h = (int)tpaint.getStrokeWidth();canvas.drawLine(startX + s, startY + s + h / 2,startX + s + (int)((width - 2 * s) * rate),startY + s + h / 2,tpaint);Paint linePaint = new Paint();linePaint.setColor(Color.BLACK);linePaint.setStrokeWidth(2);canvas.drawLine(startX, startY,startX + width,startY ,linePaint);canvas.drawLine(startX, startY + h + 2 * s,startX + width,startY + h + 2 * s,linePaint);canvas.drawLine(startX, startY,startX,startY + h + 2 * s,linePaint);canvas.drawLine(startX + width, startY,startX + width,startY + h + 2 * s,linePaint);Paint fontPaint = new Paint();fontPaint.setColor(Color.BLACK);fontPaint.setStrokeWidth(4);fontPaint.setTextSize(15);if(null != text)canvas.drawText(text,startX + width + s,startY + h + 2 * s,fontPaint);}
}

给张效果图:

源代码:http://yunpan.cn/Q7M57HF3LjjEY  提取码 2d56

android 动态壁纸设计相关推荐

  1. android 动态壁纸开发

    转:http://www.eoeandroid.com/thread-100389-1-1.html android 动态壁纸开发 参考:http://www.ophonesdn.com/articl ...

  2. 制作android动态壁纸,如何使用LibGDx制作Android动态壁纸?

    我想制作 Android动态壁纸.我想使用LibGDx.我发现了这个信息: http://www.badlogicgames.com/wordpress/?p=2652 不幸的是,我的壁纸复制代码,e ...

  3. android动态壁纸的制作

    对于Android 2.1来说Live Wallpapers动态壁纸的加入为Android桌面加入了更好的动态效果.如何开发一个Android动态桌面呢? 下面Android123给大家一个详细的步骤 ...

  4. Android动态壁纸解析

    转载自 Yalin Jin的文章:http://www.kinglloy.com/ MENU Android动态壁纸解析 24 JULY 2017 阅读之前 建议下载使用Style动态壁纸应用 文章后 ...

  5. Android 动态壁纸开发(时钟)

    Android 动态壁纸开发(时钟) 这是我人生第一篇文章,希望大家不喜无喷啊!有兴趣的可以看看玩,因为语言组织能力有限,就废话不多说直接进入重点! 先看效果 上图是动态壁纸钟的一个时钟. 我们先来看 ...

  6. Android 动态壁纸引擎试刀学习(初识安卓引擎)

    动态壁纸蛮好玩的,也没接触过,看官方有就拿了学习下,是小马第一次接触引擎Engine,激动兴奋...效果做出来了,就放博客里,记录笔记,吼吼,跟大家交流学习, 废话不多说了,先看效果,再看源码,之后小 ...

  7. android水波效果,android动态壁纸中的水波纹效果

    [实例简介] android动态壁纸中的水波纹效果,采用opengl中的shader实现 [实例截图] [核心代码] @Override public String getVertexShader() ...

  8. LibGDX制作android动态壁纸

    一.还是像普通的android动态壁纸一样,创建一个没有activity的安卓工程TestLibGDXWallpaper 二.AndroidManifest.xml配置 <application ...

  9. android动态壁纸提取,[图]大神已提取出一加8T的动态壁纸:Android 8.0+设备均可使用...

    原标题:[图]大神已提取出一加8T的动态壁纸:Android 8.0+设备均可使用 在过去数周时间里,不断有一加8T的信息在网络上被曝光.在官方的预热和爆料人士分享的细节下,一加8T基本上已经浮出水面 ...

最新文章

  1. OJ系列之---字符串分割
  2. java 省市区数据data
  3. 浅谈SQL Server数据库分页
  4. Java黑皮书课后题第7章:*7.11(统计:计算标准差)编程练习题5.45计算数字的标准差。本题…计算标准差,使用一个数组存储x的每个数。编写测试程序,提示用户输入10个数字,显示平均值和标准差
  5. rxjs里subscribe和tap的区别
  6. 2017蓝桥杯省赛---java---C---2(兴趣小组)
  7. 知识图谱需要解决的问题
  8. CV Code | 本周新出计算机视觉开源代码汇总(含目标跟踪、语义分割、姿态跟踪、少样本学习等)...
  9. 【OpenCV】OpenCV函数精讲之 -- 命名空间
  10. 内核使用硬件ip的dma,dma_alloc_coherent 与 dma_alloc_writecombine (转)
  11. 解决Synology群晖VideoStation电影电视信息无法手动搜索
  12. 软文管家发布平台_企业软文如何做好
  13. 【无标题】如何重置密码
  14. BI工具对比|Smartbi与亿信ABI两款BI数据看板软件对比
  15. 项目启动初始化SQL脚本
  16. C++ include头文件之后为什么还要在编译的时候加--lxxx
  17. ctfshow 爆破 web21-web28
  18. python时间相减_python处理时间加减
  19. 互联网早报:淘宝发布购物车分享功能,双十一有望分享微信朋友圈
  20. 输入压缩空间量是分区量吗_win7系统压缩分区的操作教程

热门文章

  1. 【计算机网络技术】三网是指电信网络、有线电视网和计算机网络。
  2. SV学习笔记—类型转换
  3. Win7 64位 下SlikSVN 的安装配置
  4. webpack 命令 Module build failed (from ./node_modules/babel-loader/lib/index.js) 错误问题解决方案...
  5. 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代
  6. 基于MVC的GUI矩形面积求解
  7. Stm32F103R6之器件签名
  8. 网络秒杀背后猫腻多 秒杀器侵害买卖双方权益
  9. mysql从小到大的语句_mysql 查询语句
  10. 基础算法----小岛上的和尚们