Android - ProgressDialog 进度对话框

创建进度对话框主要有两种方法

  • 1. 直接调用 ProgressDialog 提供的静态方法 show() 显示
  • 2. 创建 ProgressDialog 对象,再设置对话框的参数,最后调用 show() 显示

ProgressDialog 有 STYLE_HORIZONTAL 和 STYLE_SPINNER 两种样式

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private ProgressDialog pd2 = null;

private final static int MAXVALUE = 100;
private int progressStart = 0;
private int add = 0;

@SuppressLint("HandlerLeak")
final Handler hand = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x114514) {
//设置进度条的当前值
pd2.setProgress(progressStart);
}
if (progressStart >= MAXVALUE) {
pd2.dismiss();
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
ProgressDialog.show(MainActivity.this, "Loading", "少女祈祷中...", false, true);
break;
case R.id.btn2:
ProgressDialog pd1 = new ProgressDialog(MainActivity.this);
// 依次设置标题,内容
pd1.setTitle("Loading");
pd1.setMessage("思考好玩的加载提示中...");
pd1.setCancelable(true);
// 这里是设置进度条的风格, HORIZONTAL 是水平进度条, SPINNER 是圆形进度条
pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd1.setIndeterminate(true);
// 调用 show() 方法将ProgressDialog显示出来
pd1.show();
break;
case R.id.btn3:
progressStart = 0;
add = 0;
pd2 = new ProgressDialog(MainActivity.this);
pd2.setMax(MAXVALUE);
pd2.setTitle("Loading");
pd2.setMessage("正在挽救纱世里...");
pd2.setCancelable(false);
pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 取消不确定性进度
pd2.setIndeterminate(false);
pd2.show();
// 新建一个线程更新进度
new Thread() {
public void run() {
while (progressStart < MAXVALUE) {
progressStart = 2 * takeTime();
hand.sendEmptyMessage(0x114514);
}
}
}.start();
break;
}
}

private int takeTime() {
add++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return add;
}
}

Android - Notification 通知

1. 基本使用流程

状态通知栏主要涉及到2个类:Notification 和 NotificationManager

Notification: 通知信息类,它里面对应了通知栏的各个属性
NotificationManager: 是状态栏通知的管理类,负责发通知、清除通知等操作。

基本使用流程:

Step 1. 获得 NotificationManager 对象:NotificationManager mNManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Step 2. 创建一个通知栏的 Builder 构造类:Notification.Builder mBuilder = new Notification.Builder(this);
Step 3. 对 Builder 进行相关的设置,比如标题,内容,图标,动作等
Step 4. 调用 Builder 的 build() 方法为 notification 赋值
Step 5. 调用 NotificationManager的 notify() 方法发送通知

PS. 还可以调用 NotificationManager 的 cancel() 方法取消通知

2. 常用方法

首先创建 Builder 构造类

1
Notification.Builder mBuilder = new Notification.Builder(this);

然后再调用下述的相关的方法进行设置

Android - Vibrator 设备震动控制

首先需要在 AndroidManifest.xml 中申明权限

1
<uses-permission android:name="android.permission.VIBRATE" />

实例化 Vibrator 类

1
Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(VIBRATOR_SERVICE);

单次震动

1
2
// 参数为震动时间,单位为 ms
vibrator.vibrate(1000);

循环震动

1
2
3
4
5
long[] patter = {50, 50, 50, 100};
// 第一个参数接受一个 long 型数组
// patter 的偶下标为静止时间,奇下标为震动时间
// 第二个参数为循环模式,指定从数组的哪个下标开始循环,-1为不循环
vibrator.vibrate(patter, 0);

停止/取消震动

1
vibrator.cancel();

CentOS 通过 CUPS 将本地打印机共享到网络

CUPS(Common UNIX Printing System,通用Unix打印系统)是Fedora Core3中支持的打印系统,它主要是使用IPP(Internet Printing Protocol)来管理打印工作及队列,但同时也支持”LPD”(Line Printer Daemon)和”SMB”(Server Message Block)以及AppSocket等通信协议。

安装 CUPS

1
yum install cups cups-libs

修改 CUPS 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 编辑 CUPS 配置文件
nano /etc/cups/cupsd.conf

# 在 DefaultAuthType Basic 后追加一行
DefaultEncryption Never

# 修改 <Location /> 部分
<Location />
# Allow remote access...
Order allow,deny
Allow all
</Location>

# 如果需要指定 Web 面板端口,修改第 4 行的 'Port 631' 中的端口号

Android 帧动画

  • 在 drawable 目录下新建 frames.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">

<item
android:drawable="@drawable/p1"
android:duration="50" />

<item
android:drawable="@drawable/p2"
android:duration="50" />

<item
android:drawable="@drawable/p3"
android:duration="50" />

<item
android:drawable="@drawable/p4"
android:duration="50" />

</animation-list>
  • 在页面中调用 frames.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<ImageView
android:id="@+id/iv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:srcCompat="@drawable/frames" />

</LinearLayout>
  • 解析并开启动画
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ImageView iv = findViewById(R.id.iv);

AnimationDrawable animationDrawable = (AnimationDrawable) iv.getDrawable();
if(!animationDrawable.isRunning()){
animationDrawable.start();
}
}
}

  • 下面是纯代码方式实现
1
2
3
4
5
6
7
8
9
AnimationDrawable animationDrawable1 = new AnimationDrawable();
int[] ids = {R.drawable.p1,R.drawable.p2,R.drawable.p3,R.drawable.p4};
for(int i = 0 ; i < 4 ; i ++){
Drawable frame = getResources().getDrawable(ids[i]);
animationDrawable1.addFrame(frame,50);
}
animationDrawable1.setOneShot(false);
iv.setBackground(animationDrawable1);
animationDrawable1.start();

如何科学白嫖《使命召唤16:战区》

前不久,《使命召唤:现代战争》推出了船新的大逃杀模式:战区(Warzone),这个模式将免费开放给所有玩家。

还有这种好事?那么我应该如何玩到战区呢?

关于各种账号锁区的问题我就不多赘述了,这里推荐注册俄罗斯的帐号。

Android - CameraManager 控制闪光灯

需要注意的是安卓不同版本间会有一些变化,安卓7.0以上和7.0以下的版本有所区别

安卓 7.0 以上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@TargetApi(Build.VERSION_CODES.N)
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void flashControl(boolean enable) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
try {
CameraManager cameraManager = (CameraManager) getApplicationContext().getSystemService(Context.CAMERA_SERVICE);
String[] ids = cameraManager.getCameraIdList();
for (String id : ids) {
CameraCharacteristics c = cameraManager.getCameraCharacteristics(id);
Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING);
if (flashAvailable != null && flashAvailable && lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
cameraManager.setTorchMode(id, enable);
}
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}

安卓 7.0 以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Camrea camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
// 开启闪光灯
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
// 关闭闪光灯
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);

// 最后需要在销毁函数中回收资源
@Override
public void onDestroy() {
super.onDestroy();
camera.release();
}

Typecho 主题 MoeGallery

MoeGallery 是一个暗色调、响应式的简约单页相册主题

预览:https://album.redneno.me/

GitHub: https://github.com/boxlab/typecho-theme-MoeGallery

NodeMCU 开发学习笔记

这篇文章记录了我的 NodeMCU 学习过程

引脚定义

接口定义

NodeMCU Pin Definition

GPIO 与 I/O 索引表

IO索引 ESP8266针脚 IO索引 ESP8266针脚
0 GPIO 16 7 GPIO 13
1 GPIO 5 8 GPIO 15
2 GPIO 4 9 GPIO 3
3 GPIO 0 10 GPIO 1
4 GPIO 2 11 GPIO 9
5 GPIO 14 12 GPIO 10
6 GPIO 12

其中 D0(GPIO16) 只能用于 GPIO 读取/写入,不支持中断和 PWM/I2C/OW

PHP: 我的世界颜色代码转换 HTML

我的世界:§

§和一个字符可以组成是我的世界中控制字体颜色样式(如木牌、服务器名称)的标识符。例如:

1
§cEnd of The Century §lSurvival

上面这段文字在我的世界中的显示效果即为:

End of The Century Survival

现在我们需要通过代码来对颜色标识符进行转换,使其成为可以被浏览器解析的 HTML 代码

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×