Android – 初识自定义View

前言

一直都想学习自定义View,之前也立Flag决心要学习,但是网上的视频资料都过于老套,最重要的是杂乱无章,然后就认为很难很深奥,没法循序渐进的学习这个知识点,然后就搁置了。今天看到一个公众号的分享,连载六篇文章,逐步学习自定义View,我只能说两个字:牛批!

强力推荐:http://hencoder.com/ui-1-1/

自定义绘制知识的四个级别

  1. Canvas 的 drawXXX() 系列方法以及 Paint 最常见的使用
  2. Paint 的完全攻略
  3. Canvas 对绘制的辅助 — 范围裁切和几何变换
  4. 使用不同的绘制方法来控制绘制顺序

先写一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置画笔抗锯齿
mPaint.setAntiAlias(true);
//设置画笔颜色,就是绘制内容的颜色
mPaint.setColor(Color.BLACK);
//设置绘制模式为画线模式
mPaint.setStyle(Paint.Style.STROKE);
//设置线条宽度
mPaint.setStrokeWidth(20);
//绘制一个圆,参数以此是:圆心X坐标,圆心Y坐标,圆的半径,画笔。
canvas.drawCircle(100, 100, 50, mPaint);
//把整个画布区域填充为半透明红色
canvas.drawColor(Color.parseColor("#88880000"));
}

绘制模式setStyle()具体来说有三种:FILL、STROKE 和 FILL_AND_STROKE。FILL 是填充模式,STROKE 是画线模式,FILL_AND_STROKE 是两种模式一并使用。默认模式是填充模式。当在 FILL 和 FILL_AND_STROKE 模式下,可以通过 setStrokeWidth(像素值) 来设置线条的宽度。

emmmm,看完了八篇,感觉中间几篇用不到耶,学到的还是蛮多的,毕竟敢于面对自定义View了。自定义View的绘制部分算是讲完了,期待后面的布局和触摸反馈系列吧。相信学完之后就能:


Android – 计步传感器

前言

之前写过一篇关于计步器(–> Android – 计步器的实现 <–)的文章,里面只是简单的介绍了一下原理,其实最重要的是看了大牛的各种优化,源码地址也放进去了。不得不说,大佬就是大佬。

本文主要是记录一下传感器该怎么玩,大佬请拍砖。

首先要在要在manifest中声明需要的软硬件特性:

1
2
3
4
5
6
7
8
<!--计步传感器-->
<uses-feature
android:name="android.hardware.sensor.stepcounter"
android:required="true" />
<!--步行检测传感器-->
<uses-feature
android:name="android.hardware.sensor.stepdetector"
android:required="true" />

emmm,这里我还想在啰嗦几句。计步传感器返回的是从开机至当前的步数,当重启手机后清零,因为是硬件传感器,所以精度高且低功耗,不需要后台保活。步行检测传感器只是用来检测走步,每次返回 1 或 0 。需要长时间计步建议使用计步传感器。

代码:

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
public class ToolsTodayStep extends Activity implements SensorEventListener {
private TextView mTextViewStepNumber;
private SensorManager mSensorManager;
private Sensor mSensorCounter;
private Sensor mSensorDetector;
private int counterStep = 0;
private int counterDetector = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tools_today_step);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
mSensorDetector = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
initView();
}
@Override
protected void onResume() {
super.onResume();
/**
* 注册传感器的三个参数说明
* 1. 接收信号的Listener实例
* 2. 传感器类型
* 3. 接收频度
*/
mSensorManager.registerListener(this, mSensorCounter, SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, mSensorDetector, SensorManager.SENSOR_DELAY_UI);
}
private void initView() {
mTextViewStepNumber = findViewById(R.id.tv_stepNumber);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
//当传感器值发生变化时
if (sensorEvent.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
//启动可能需要十步
counterStep = (int) sensorEvent.values[0] + 10;
} else if (sensorEvent.sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
counterDetector++;
}
mTextViewStepNumber.setText("当前走了 " + counterDetector + " 步" + " ,总共走了 " + counterStep + " 步");
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
//当传感器精度发生变化时
}
}

布局就不放了,就一个TextView。实践了一下,如果APP停留后台的话,可一直看到当前步数和总步数变化,还是很准确的。当关闭APP之后,当前步数就清零了,但总步数还在累加。

需要优化的还很多,本菜鸡还在看大佬源码。。。

参考

http://blog.csdn.net/qq_21051503/article/details/73127662

http://blog.csdn.net/fukaimei/article/details/78306097

http://www.jianshu.com/p/5d57f7fd84fa

http://blog.csdn.net/WTunique/article/details/54581476

http://blog.csdn.net/niuzhucedenglu/article/details/53378265

http://blog.csdn.net/niuzhucedenglu/article/details/53379385

http://www.jianshu.com/p/cfc2a200e46d


Kotlin – 小栗子

前言

上Github的时候,发现今天是万圣节。热力图的颜色都变成了南瓜色,看起来还不错哦。

还没忘记上次立的Flag,已经坚持了三天了。想了一下,光学不用是肯定容易忘了,所以就想边学边做一些小栗子,但是哪些例子好的?刚好,我们在学Android,老师每周也会让做一些小实验,那就用Kotlin重写这些实验就当练习了,不过讲道理,不简单!老师给的小实验都很基础,之前也都放在一个叫 Exp1 这个仓库里,用Kotlin重写就放在 MyKotlinDemo 这个仓库吧。

好想找一个小伙伴一起学习呀,QwQ . . .


Android – Intent 过滤器

前言

我们知道,Intent有两种启动方式,显式和隐式启动。显式启动去下:

1
startActivity(new Intent(MainActivity.this,SecondActivity.class));

显式启动没什么好说的,今天主要是说说隐式启动。一个简单的例子如下:

1
2
3
Uri uri = Uri.parse("http://www.omooo.top");
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);

以上示例并没有明确指定要启动的组件,而是由系统决定。系统需要通过某种匹配规则来寻找需要启动的目标组件,这种匹配规则就依赖于Intent的过滤器实现。Intent过滤器是根据Intent中的动作(action)、类别(category)、数据(data)内容,对目标组件进行匹配和筛选的机制。当Intent匹配到一个过滤器上,系统就会启动相应的组件并传递给相应的Intent对象;如果匹配出了多个过滤器,系统会弹出对话框,由用户进行选择。下面就开始深入了解过滤规则。

more >>


每天学点Kotlin

前言

前几天Android Studio正式发布3.0版本,这个版本增加了对Kotlin的支持,不用在向以前一样安装插件转化代码了,可以直接新建一个kotlin项目,我觉得是时候上手尝试Kotlinl,一边学Android Java一边学Kotlin,毕竟Kotlin被Google定为Android第一开发语言,那Kotlin肯定有它很多的优势,慢慢发掘吧。

第一步

1
2
3
4
5
6
7
8
9
10
11
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun testKotlin(view: View) {
Toast.makeText(this, "Hello Kotlin", Toast.LENGTH_SHORT).show()
}
}

最后

Kotlin 笔记:https://github.com/Omooo/KotlinNotepad

又要立Flag了,每天学一点,希望这次能坚持久一点。

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?