View的事件分发
从我刚进实验室的时候,学长学姐就说View的事件分发机制是Android里面一个很重要的内容,要我们好好学。
但是随着自己对Android了解的深入,越发觉得这个东西很有必要了解下,正好Android艺术开发探索也看到了View这块,也看了郭霖大神的博客和另一位大神的博客,所以就好好学习了一番,并写了此博客。
1. MotionEvent在开始讲View事件分发之前,我们先来了解下MotionEvent。
这个就是手指解除到屏幕后所产生的一系列事件,主要为一下三个典型事件:
ACTION_DOWM——手指刚接触屏幕
ACTION_MOVE——手指在屏幕上移动
ACTION_UP——手指从屏幕上松开
ACTION_CANCEL——结束事件(非人为)
正常情况下,一次手指触摸屏幕然后离开可能触发一下两种情况:
点击屏幕然后松开:ACTION_DOWN -> ACTION_UP
点击屏幕然后滑动再松开:ACTION_DOWN -> ACTION_MOVE -> ACTION_UP
下面一个图片来概括下:
2. 事件分发传递规则众所周知,AndroidUI是由Acti ...
OpenGL ES 2.0笔记2——顶点、坐标、图元
上节我们对OpenGL做了一个大致的介绍,并写了一个基本框架,在这节中我们将会介绍顶点、坐标系和图元
顶点在OpenGL中,所有的东西的结构都是从一个顶点开始的。
所谓顶点,就是一个几何图形的拐点。在介绍顶点之前,我们首先介绍下OpenGL坐标。
OpenGL坐标系如果有会Android开发的朋友,一定会默认为从屏幕的左上角开始,水平往右是x轴,竖直向下是y轴。
但是在OpenGL中是不同的,OpenGL是从显示视窗的正中心是中心,也就是$(0, 0)$,而屏幕最左边的x轴坐标是-1,屏幕最右边的x轴坐标是1,屏幕最上面的y轴坐标是1,屏幕最下面的y轴坐标是-1,也就是下面这幅图:
在代码中定义顶点在OpenGL中定义顶点有点特殊,我们第一反应都是直接拿数组将顶端存起来就行了,但是在OpenGL中,你除了要将顶点的坐标用数组存起来以外,还得定义一个常量,用来标记一个顶点有两个分量:1234567891011121314151617181920private static final int POSITION_COMPONENT_COUNT = 2;float[] tableVe ...
OpenGL ES 2.0笔记1——简介
OpenGL是什么?OpenGL ES又是什么?简介OpenGL是一个跨平台的软件接口语言,用于调用硬件的2D、3D图形处理器。
然而受限于现在的移动设备性能,如果将OpenGL直接用在他们上面将会特别卡,于是就出现了OpenGL ES。 OpenGL ES是OpenGL的分支,他专门作用于嵌入式设备,去掉了OpenGL很多不必要的功能。
应用场景
游戏
视频播放器
视频编辑应用
图片编辑应用
等对图像处理的及时性要求较高的应用场景。
Android对OpenGL ES 的支持
OpenGL ES 版本
基于OpenGL的版本
Android引入的版本
兼容性
功能、特色
1.0&1.1
1.3&1.5
Android 1.0
-
固定的图像管道,开发难度相比2.0低
2.0
2.0
Android 2.2
不兼容1.x
可编程的渲染管道,性能效率更高,开发难度更高
3.0
3.x
Android 4.3
兼容2.0
性能更高,支持ETC2格式的透明纹理压缩
3.1
4.x
Android 5.0
兼容2.0/3.0
新增计算着色器、单独的 ...
Flutter入门并开发天气预报APP(8)——天气预报第二步-选择省、市、区界面及网络请求
项目Github地址:a1203991686/CoolWeather_Flutter
在第六章中我们写了天气预报的页面, 但是你作为天气预报肯定能选择城市吧。所以我们现在来写选择省、市、区的界面。
我们使用的是郭霖大神在第一行代码最后面酷欧天气的API。
1. 实现界面既然是一个选择省市区的界面,那么我们就用ListView。
首先看一下大致界面:
就直接使用ListView的builder()方法,忘了的同学可以看前面第5章。
省在view文件夹下新建一个类provinces_page.dart,接下来就在这个文件里面写代码:12345678910111213141516171819202122232425262728class ProvincesPageWidget extends StatefulWidget { ProvincesPageWidget({Key key}) : super(key: key); @override ProvincesPageStateWidget createState() => new ...
Flutter入门并开发天气预报APP(7)——Http网络请求、Json转Dart实体类及异步更新UI
相关Demo源码可见Github a1203991686/CoolWeather_Flutter
Flutter Http 网络请求Flutter网络请求可分为两种方式,一种为Dart:IO库中为我们提供的HttpClient,另一种为Dart第三方库Dio。
HttpClientHttpClient是Dart:IO库自带的一个类,通过他来实现网络请求最底层、也可以完完全全的自定义设置,但是相对于其他人封装好的第三方库来说显得复杂。
引入导入Dart:IO库:1import 'dart:io';
创建一个HttpClient:1HttpClient httpClient = new HttpClient();
创建一个Uri如果你是Http请求:1234567var uri = new Uri.http( host, queryParameters: { "xx":"xx", "yy":"dd" });如果你是Htt ...
Flutter入门并开发天气预报APP(6)——天气预报第一步-界面
经过前面的对于Flutter的介绍,我们现在已经可以开始写我们的天气预报APP的界面了。
项目Github地址:a1203991686/CoolWeather_Flutter
1. 大致界面最终写成的大致界面如图:
我们可以把这个界面拆分成如下部分:
可以看到我们APP主要有最上面用来显示地点和刷新时间的Title、显示温度和天气的两个Text、显示3天预报的ListView、显示空气质量的GridView、以及最后显示生活建议的ListView。
此处会用到我们前面学过的所有知识,如果有同学没有看过前面内容的,可以看下本系列前面的文章。
2. 创建项目首先我们创建一个新的Flutter项目:
在AndroidStudio点击File->New Flutter Project;
接着选择Flutter Application->NEXT。接着填写你的项目名称等一系列信息后点击next;
接着输入你的组织/公司名称作为包名,最后点击Finish即可,这样就新建了一个Flutter项目,并且Flutter会自动为你生成一个计数器Demo;
让我们把mian.dart里 ...
Flutter入门并开发天气预报APP(5)——SingleChildScrollView、ListView和GridView
下面我们来介绍下Flutter中的滑动控件SingleChildScrollView、列表ListView和表格GridView。
SingleChildScrollViewSingleChildScrollView类似于Android中的ScrollView,我使用的较浅,在我目前看来,他和ScrollView的唯一区别就是它还可以横向滚动。
我们先来看下他的定义:123456789SingleChildScrollView({ this.scrollDirection = Axis.vertical, //滚动方向,默认是垂直方向 this.reverse = false, this.padding, bool primary, this.physics, this.controller, this.child,})
scrollDirection:设定滚动的方向,可以设定Axis.vertical或者Axis.horizon;
reverse:是否按照阅读方向的反方向滑动,emmm这个可能有点觉得莫名其妙,但是如阿拉伯语言地区,他们阅读 ...
Flutter入门并开发天气预报APP(4)——基础Widget
到这章我们就差不多可以开始写天气预报了。首先我们来看一下一些基础简单的Widget。
基础组件文本Text用于显示简单的文本,包含一些控制文本显示的属性。1234567891011Text( "1234",),Text( "1234", style: TextStyle( color: Colors.purple, fontSize: 32.0, fontWeight: FontWeight.bold, ),),
需要显示的文本信息直接放到一个双引号里面就可以了;
textAlign:文本对齐方式;
maxLines:文本显示的最大行数;
overflow:指定多余文本的截断方式;
textScaleFactor:指定文本相对于当前字体大小的缩放因子;
TextStyle:设置显示文本的字体、颜色、粗细等样式:
height:指定行高,但是不是绝对值,而是一个因子,相当于fontsize * height;
fontFamily:设置字体;
fontSize:设置字体大小
...
Flutter入门并开发天气预报APP(3)——Widget
简介在Flutter中,Widget是个非常基本的东西,我在上一章就说过,Flutter中只要是界面都是Widget,你可以把它就理解成是控件,但是又和Android的View控件不同的是,在Flutter中,包括Padding、Align、手势检测的GestureDetector等等,都算是Widget。
其实大多数时候,你就可以把Widget直接理解成UI控件就行了,因为Padding、Align、GestureDetector等等也都是为UI服务的,你就可以理解成Flutter中只要与UI有关的属性都可以算是控件。
Widget的状态在Android中,我们可以直接通过更新数据来达到刷新UI的目的。但是如果使用Flutter,就像我们前面说的计数器的Demo,如果直接通过StatelessWidget也就是无状态Widget的话,是没法进行刷新UI的,只能写一个死界面,也就是说如果在Flutter中界面写出来的就是一个死界面,只有通过刷新状态才能更新UI。
Widget有两个直接子类:StatelessWidget和StatefulWidget:
StatelessWidge ...
Flutter入门并开发天气预报APP(2)——Flutter计数器Demo
本文样例都是使用的AndroidStudio,如果你使用Xcode或者vscode,代码都是一样的,只是IDE创建项目的方式以及运行按键位置不同而已。
创建Flutter项目AndroidStudio中选择File->New->New Flutter Project->Flutter Application->NEXT。接着填写你的项目名称等一系列信息后就创建成功了,我们就会看到AndroidStudio已经为我们创建好了一个Demo,接着连上你的手机或者打开你的虚拟机,按下AndroidStudio的运行键,不一会儿,你就会惊喜的发现你的手机上就有一个Flutter计数器Demo了。
介绍下AndroidStudio界面这是我的AndroidStudio界面,接下来我分三个部分介绍下AndroidStudio的大致界面。
控制区
一次介绍每一个按钮的功能。
第一个是用来选择运行设备的,比方说我现在就选的是我的虚拟机,然后我按下运行后就可以将项目运行到我的虚拟机上而不会运行到连着我的电脑的手机上去;
第二个是选择运行哪个Flutter module,如果你同 ...