使用 Processing-Android自己实现 METER 动态壁纸
Recreate METER Wallpapaer using Processing-Android!
关于 METER : METER On Androidexperiments
想要自己实现一个 WIFI 信号的动态壁纸,于是尝试了下。提示:需要 Processing-Android 4.0 Pre-Release
步骤一:画背景及 WIFI 信号背景三角形
Reference :
background() | triangle()
void setup()
{
fullScreen(P3D);//当然 P2D 应该也行的样子。
}
void draw()
{
background(12, 39, 43);// 背景色
beginShape(TRIANGLES);
fill(0,94,83);// WIFI 三角背景色
vertex(width / 6 * 1, height / 5 * 1);
vertex(width / 2, height / 5 * 3);
vertex(width *5 / 6, height / 5 * 1);
endShape();
}
效果:
步骤二:画 WIFI SSID 字段
先在 Processing - Android - Sketch Permissions 里勾选 android.permission.ACCESS_WIFI_STATE
,否则读取 WIFI 信息会闪退。获取 Context 参见 processing-android/issues/227 里的 Commit,这里是用的是 surface.getComponent();
import android.net.wifi.*;
import android.content.*;
import android.app.*;
import processing.core.*;
import android.os.Bundle;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
String wifiName;
android.content.Context context;
void setup()
{
fullScreen(P3D);
}
void draw()
{
background(12, 39, 43);
beginShape(TRIANGLES);
fill(0,94,83);
vertex(width / 6 * 1, height / 5 * 1);
vertex(width / 2, height / 5 * 1 + width / 3 * 2);
vertex(width *5 / 6, height / 5 * 1);
endShape();
textSize(width / 20); // WIFI SSID 字体大小
textAlign(CENTER, CENTER);
text("WIFI : "+wifiName, width / 2, height / 5 * 1 + width / 3 * 2 + height / 20);
fill(0, 102, 153);
}
public void onResume() {
super.onResume();
context = (Context) surface.getComponent();
WifiManager wifiManager = (WifiManager) context.getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
wifiName = info.getSSID(); // 获取 SSID
}
public void onPause() {
super.onPause();
}
步骤三:画 WIFI 强度
这里还有一个调整,就是获取信号强度和 SSID 都不在 onResume()
做了,因为 onResume()
一般是后台转前台才触发,而我们要保证在 Launcher 里面能动态刷新,所以设立一个 Timer 来每十秒钟获取好了。
截图里面的三角形是全填满的,公司信号太好,我懒得找一个没信号的地方测试了,反正公式是对的就行啦。
import android.net.wifi.*;
import android.content.*;
import android.app.*;
import processing.core.*;
import android.os.Bundle;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import java.util.*;
String wifiName;
int wifiLevel; // 0 - 10
android.content.Context context;
boolean canRefreshWifi;
float Point1X,Point2X,Point3X;
float Point1Y,Point2Y,Point3Y;
void setup()
{
fullScreen(P3D);
Timer t = new Timer(); // 每 10 秒 Run 一次。
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (canRefreshWifi)
{
context = (Context) surface.getComponent();
WifiManager wifiManager = (WifiManager) context.getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
wifiName = info.getSSID();
wifiLevel = WifiManager.calculateSignalLevel(info.getRssi(), 11); // 信号强度
}
}
},0,10000);
}
void draw()
{
background(12, 39, 43);
beginShape(TRIANGLES); // 背景三角形
fill(0,94,83);
vertex(Point1X, Point1Y);
vertex(Point2X, Point2Y);
vertex(Point3X, Point3Y);
endShape();
beginShape(TRIANGLES); // 前景三角形
fill(37,206,182);
vertex(Point2X + (Point1X - Point2X) * wifiLevel / 10, Point2Y + (Point1Y - Point2Y) * wifiLevel / 10);
vertex(Point2X, Point2Y);
vertex(Point2X + (Point3X - Point2X) * wifiLevel / 10, Point2Y + (Point3Y - Point2Y) * wifiLevel / 10);
endShape();
textSize(width / 20);
textAlign(CENTER, CENTER);
text("WIFI : "+wifiName, width / 2, height / 5 * 1 + width / 3 * 2 + height / 20);
fill(0, 102, 153);
}
public void onResume() {
super.onResume();
canRefreshWifi = true; // 回到前台,可以继续刷新 WIFI 信息。
Point1X = width / 6;
Point2X = width / 2;
Point3X = width / 6 * 5;
Point1Y = height / 5;
Point2Y = height / 5 * 1 + width / 3 * 2;
Point3Y = height / 5;
}
public void onPause() {
super.onPause();
canRefreshWifi = false;
}
步骤四:实现水平仪效果
加上地理位置的权限,反正就是 ACCESS 开头中间带 LOCATION 的两个,我也忘了具体名字了。
代码略长了,于是放在了 Gist 上。后面写的有些乱,效率上非常差,不过作为示范应该还是能看的。如图。
到这里,基本上实现了一个功能上和 METER 差不多的动态壁纸,可以显示 SSID,显示信号强弱,自带水平仪效果。