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

参见:使用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. Js打印表格时部分边框不显示(table 标签)
  2. 【数字孪生】工业互联网和数字孪生
  3. kibana智能检索发送多次_msearch —— 配置index pattern,同时设置时间段,就知道到底是在哪些索引里去查找数据了...
  4. Spring Boot自动配置原理
  5. 该文章为递归寻找目录下目标文件(待完善,但是能用)
  6. [html] html5中的meta标签renderer有什么作用?
  7. mysql 字符集 校验规则_MySQL字符集及校验规则
  8. sql关联查询子表的第一条_SQLAlchemy(8)惰性查询
  9. 用python画篮球场_Python可视化分析——科比整个职业生涯的投篮点分布
  10. html Table 转CSV中文乱码解决
  11. erp进销存管理系统
  12. python math类
  13. [Docker入门-2] Docker Containers 的创建和使用
  14. 实现游戏的存档以及读档
  15. word中将英文及数字全部修改为Times New Roman字体
  16. arm linux 内核崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...
  17. 微信号名称乱码什么情况_微信号改成什么比较好,2020最火微信号!
  18. datasources数据源自动配置
  19. 论return 0的高级写法 bushi​​​​​​​)
  20. 【Java基本数据类型】Long和long的区别

热门文章

  1. 短视频程序的魅力,你为什么喜欢抖音?知乎大神的回答
  2. 四大组件以及 Application和Context的全面理解
  3. 用COSMIC方法帮助澄清需求的案例
  4. 监控新星 | 实战Prometheus搭建监控系统
  5. 微信小程序开发工具有哪些?哪个工具好用
  6. python实验室预约系统(基于xlsx表)(石山代码)
  7. 惠普dl380g7安装linux,hp380服务器安装linux
  8. 浅谈NIO和Epoll实现原理
  9. 《SQL Server 2008从入门到精通》--20180717
  10. 期货资管分仓跟单系统的开发搭建