gesture打开增强模式 操作十分简单
打开手机usb调试打开电脑cmd,进入adb程序用数据线连接手机和电脑输入以下代码
adb -d shell sh /storage/emulated/0/Android/data/com.omarea.gesture/cache/up.sh
搞定
如果机器人变成绿色,说明增强模式启用成功
文章目录 一、Android中的尺寸单位1.1 in1.2 mm1.3 px1.4 pt1.5 dp1.6 sp附:dpi(度量单位) 二、使用TypedValue.applyDimension()将尺寸转换为标准尺寸 一、Android中的尺寸单位 1.1 in 设备相关单位。inch 表示英寸,是屏幕的物理尺寸,是屏幕的对角线长度。每英寸等于 2.54 厘米。
1.2 mm 设备相关单位。表示毫米,也是屏幕的物理尺寸。
1.3 px 设备相关单位。pixel 表示屏幕的实际像素。
1.4 pt 设备相关单位。表示一个点,大小为 1/72 英寸(in),是屏幕的物理尺寸。
1.5 dp 设备无关单位。dp 即 dip,Device Independent Pixel(设备无关像素)。一个 dp 相当于 160dpi 屏幕中的一个 px。在320dpi的屏幕中,一个dp相当于2个px。
1.6 sp 设备无关单位。Scale Pixel(比例像素)。是字体大小单位。使用 dp 作为单位设置字体大小时,字体大小不会随着系统字体大小而改变;使用 sp 作为单位设置字体大小时,字体大小会随着系统字体大小而改变。
附:dpi(度量单位) Dots per inch 每英寸像素数。对于一台分辨率为 240x320,屏幕物理尺寸为 1.5英寸 x 2英寸 的手机,他的密度为 240/1.5 或者 320/2,密度为 160dpi。
二、使用TypedValue.applyDimension()将尺寸转换为标准尺寸 Android 中的标准尺寸为 px,我们可以使用 TypedValue.applyDimension() 方法将其它的尺寸单位转换为 px。
方法一
int findCircleNum(vector<vector<int>>& M) { int n = M.size(); vector<vector<int>> map_n(n); vector<bool> visit(n, false); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (M[i][j] == 1 and i != j) map_n[i].push_back(j); } } int result = 0; for (int i = 0; i < n; i++) { if (visit[i] == false) { result += 1; visit[i] = true; dfs(M, visit, i); } } return result; } void dfs(vector<vector<int>> &M, vector<bool> &visit, int index) { int n = M.
官网
love2d.org
1、写个贪吃蛇
以下是main.lua的代码
snake = {} speed = 50 function init() snake = {} local head = {x=love.graphics.getWidth()/2,y=love.graphics.getHeight()/2,direction='up'} table.insert(snake,head) local tail = {x=love.graphics.getWidth()/2,y=love.graphics.getHeight()/4*3,direction='up'} table.insert(snake,tail) end function love.load(arg) init() end function line2line(line1_x1,line1_y1,line1_x2,line1_y2,line2_x1,line2_y1,line2_x2,line2_y2) return (not((math.max(line1_x1,line1_x2)<math.min(line2_x1,line2_x2)) or (math.min(line1_x1,line1_x2)>math.max(line2_x1,line2_x2)))) and (not((math.max(line1_y1,line1_y2)<math.min(line2_y1,line2_y2)) or (math.min(line1_y1,line1_y2)>math.max(line2_y1,line2_y2)))) end function love.update(dt) --head------------------------------------------------ if snake[1].direction == 'up' then snake[1].y = snake[1].y - dt*speed elseif snake[1].direction == 'down' then snake[1].y = snake[1].y + dt*speed elseif snake[1].direction == 'left' then snake[1].
如果你一直想学Python,但是不知道如何入手,那就别犹豫了。这篇文章就是为你写的。
/>
疑问
随着数据科学概念的普及,Python这门并不算新的语言火得一塌糊涂。
因为写了几篇用Python做数据分析的文章,经常有读者和学生在留言区问我,想学习Python,该如何入手?
我经常需要根据他们的不同情况,提出对应的建议。这样针对性虽强,但效率不高。这个问题,我还是写出来,让更多的人一同看到吧。
有几位出版社的编辑,给我发私信,鼓励我赶紧写一本Python教材出来。
我暂时还没有写Python基础教程的计划。因为在我看来,现有的学习资源已经足够好了。
有现成的资源和路径,为什么许多人依然在为学Python犯愁呢?
因为学习有个效率问题。
Python语法清晰明快,简单易学。这是Python如此普及的重要原因。但是,选择合适的Python学习方式,需要跟你自身的特性相结合。
人群划分的标准是什么?不是你是否计算机相关专业,也不是你是否已经工作,而是一个重要的指标——你的自律能力。
你可能觉得我说的话没有信息含量。自律能力强,学得更好,地球人谁不知道?
可是,自律不够强的人,难道就注定什么也不能学了?
当然不是。
每个人的性格都有不同的特点,没有绝对的高下之分。不信你听听刘宝瑞先生的相声《日遭三险》,就明白了。
/>
自律能力也是这样。只要你能清楚认识自己,就能以更高效的方法来学习新知识和技能。
下面我们分类探讨一下,不同自律能力的人,该如何学Python,才能更高效。
路径I
咱们先从自律能力最差的人说起。
这样的同学,往往是三分钟热度。偶然受到了刺激,发奋要学习Python,以便投入数据科学的事业中。
他会立即跑到图书馆或者书店抱回来一本《X天从入门到精通Python》的书开始啃。结果X天还没到,就顺利跑完了从入门到放弃的全过程。
你没能坚持下来,自己肯定是有责任的。但是最大的问题,在于过度高估自己的自律能力。
这样的同学,我推荐你到Coursera平台上,按部就班学习一门非常好的MOOC——"Programming for Everybody”。
/>
推荐这门课,是因为课程质量真是太好了。
首先是教材好。这本教材的来源是有故事的。
先是 Allen B. Downey 写了一本开放书籍 "Think Python: How to Think like a Computer Scientist”。
/>
这本书在Amazon上的评价是这样的:
/>
Charles Severance觉得这本书写得太好了,想把它作为教材。于是征得作者同意,大篇幅借鉴了这本书的内容架构,编写了一本 "Python for Informatics”。
/>
Charles写作这本书的时候,同时开放推出了iBook格式。里面就包含了自己的授课视频,供学生直接观看学习。
/>
后来,Charles用这本书扩展,做成了一门MOOC。2015年上线不久,硅谷资深工程师就都争相学习。
Charles深谙课程迭代的技艺。他不断添加内容,完善课程体系,将一门课发展成一个专项课程(Signature Track),并且将教材升级为 "Python for Everybody: Exploring Data In Python 3”
/>
在目前全球MOOC口碑榜上,Charles的这门课一直名列前茅。
/>
Flow 库是在 Kotlin Coroutines 1.3.2 发布之后新增的库,也叫做异步流,类似 RxJava 的 Observable、 Flowable 等等,所以很多人都用 Flow 与 RxJava 做对比。而 Flow 则比 RxJava 简单很多。
我们知道 MVVM 中 LiveData 是一个生命周期感知组件,最好在 View 和 ViewModel 层中使用它,如果在 Repositories 或者 DataSource 中使用会有这两个主要的问题:不支持线程切换,其次不支持背压。而 Flow 正好是为解决此问题的。
RxJava 与 Flow 比较
RxJava模式 Flowable.create<Int>({ for (index in 1..10) { println(index) it.onNext(index) } it.onComplete() }, BackpressureStrategy.BUFFER) .map { return@map it * it } .filter { return@filter it > 5 } .toList() .subscribe({ println(it) }, { println(it) }) Flow 模式
背景 数据轨迹在湖北落地,面临查询分析时间过长的问题,并且查询时间与大数据能够分配的资源有直接的线性关系。需要考虑如何将数据轨迹查询提速。
与paas的niuxl沟通,建议使用impala或者spark做查询,于是查询对比各种开源的OLAP引擎。
按照查询类型划分,OLAP一般分为即席查询和固化查询,
即席查询:通过手写sql完成一些临时的数据分析需求,这类sql形式多变、逻辑复杂,对查询时间没有严格要求固化查询:指的是一些固化下来的取数、看数需求,通过数据产品的形式提供给用户,从而提高数据分析和运营的效率。这类的sql固定模式,对响应时间有较高要求。 按照架构实现划分,主流的OLAP引擎主要有下面三点:
MPP架构系统(Presto/Impala/SparkSQL/Drill等)。这种架构主要还是从查询引擎入手,使用分布式查询引擎,而不是使用hive+mapreduce架构,提高查询效率。搜索引擎架构的系统(es,solr等),在入库时将数据转换为倒排索引,采用Scatter-Gather计算模型,牺牲了灵活性换取很好的性能,在搜索类查询上能做到亚秒级响应。但是对于扫描聚合为主的查询,随着处理数据量的增加,响应时间也会退化到分钟级。预计算系统(Druid/Kylin等)则在入库时对数据进行预聚合,进一步牺牲灵活性换取性能,以实现对超大数据集的秒级响应。 数据轨迹现有的实现方式,从业务诉求看为:每账期按照指定的查询列取数据,进行分析未结算原因,偏向固化查询的方式。但现有的实现方式为先按照查询列值查询出主表数据,再根据主表附属表的关联字段,获取查询附属表的sql,sql为动态拼接出来,这种方式更偏向于即席查询的实现。
需要从以下三个方面考虑框架选型:数据存储和构建、安装搭建、开发成本。
impala impala是Cloudera开发开源的,Impala是Cloudera开发并开源的,能查询存储在HDFS和HBase中的数据。同Hive一样,也是一种SQL on Hadoop解决方案。但Impala抛弃了MapReduce,使用更类似于传统的MPP数据库技术来提高查询速度。
impala可以直接查询hdfs或hbase上的数据,可以与现有的存储无缝对接。impala需要单独安装,公司内paas主推。需要与现场确认。impala提供jdbc接口和sql执行引擎,可以与现有系统集成 Presto presto是Facebook开源的大数据查询引擎,为了解决hive查询慢产生。使用java编写,数据全部在内存中处理。
原生集成了Hive、Hbase和关系型数据库。需要与现场确认是否能提供提供jdbc接口和sql执行引擎,可以与现有系统集成 druid druid同kylin一样,是采用预计算的方式。主要解决的是对于大量的基于时序的数据进行聚合查询。数据可以实时摄入,进入到Druid后立即可查,同时数据是几乎是不可变。通常是基于时序的事实事件,事实发生后进入Druid,外部系统就可以对该事实进行查询。
需要预计算,将数据存储在druid的Segment文件中,占用一部分存储资源需要与现场确认是否能提供对sql支持不友好,需要用他自己的方言书写 kylin kylin是一种OLAP数据引擎,支持大数据生态圈的数据分析业务,主要是通过预计算的方式将用户设定的多维度数据立方体(cube)缓存起来,达到快速查询的目的。应用场景应该是针对复杂sql join后的数据缓存。
这种OLAP引擎,一般包括以下几部分:
数据构建存储:cube构建,元数据信息sql解析执行:Query引擎(sql解释器),routing模块(sql执行)上层接口服务;jdbc/odbc接口,rest服务 应用思路:将hive中的数据按照查询列 构建成cube,存储到hbase中,数据轨迹连接kylin的jdbc接口实现快速查询。
需要预计算,将数据构建成cube存储到hbase需要与现场确认是否能提供提供jdbc接口和rest服务 redis 将要分析的数据同步到redis,在redis中快速查询数据。可以在分析前将本月数据同步到redis。
遗留问题:
如何同步数据,如何删除上个账期数据用什么做key,数据没有主键,是否可以使用查询列做key,如何从hive中将数据同步出来? hive操作hbase 较多hive操作hbase的方法,没有hbase操作hive数据的。
引用概念 Serde:序列化反序列化,serialize/deSerializeMPP:大规模并行处理技术(Massively Parallel Processor) 参考文档 Apache Kylin在美团点评的应用(【案例分享】Apache Kylin在美团点评的应用 - 知乎)presto、druid、sparkSQL、kylin的对比分析(presto、druid、sparkSQL、kylin的对比分析,如性能、架构等,有什么异同? - 知乎)盘点SQL on Hadoop中用到的主要技术(http://sunyi514.github.io/2014/11/15/盘点sql-on-hadoop中用到的主要技术/)Druid(准)实时分析统计数据库——列存储+高效压缩(Druid(准)实时分析统计数据库——列存储+高效压缩 - bonelee - 博客园)
在测试中 使用 webpack版本5.2.0 当我们使用 html-webpack-plugin(版本4.5.0)控件的时候 会出现如下错误提示
通过多次测试 发现 可能是webpack5+ 与 html-webpack-plugin 不能友好兼容 最好的方案就是 webpack降级到4版本
html-webpack-plugin官方文档 处理方式如下图所示 但是在测试的时候发现这个方案并不靠谱 有兴趣的话 大家可以试试
当我使用 clean-webpack-plugin (版本3.0.0)这个控件的时候 也出现错误 (如下图)
这个错误跟webpack5是没有关系的 但是官方文档 有点过时了 实际项目中 我们需要 这样子 引入控件 如下:
const {CleanWebpackPlugin} = require("clean-webpack-plugin");
plugins: [ new CleanWebpackPlugin() ] ,
题解:
这是浙大PAT的第一题,题意比较简单。 算法如下: 1.算法开始。 2.如果n!=1,下一步。否则跳到第五步。 3.如果n是偶数,n/=2,step++,回到第二步。否则进行下一步。 4.如果n是奇数,n=(3n+1)/2,step++,回到第二步。 5.输出step。 6.算法结束。 C++代码
#include <iostream> using namespace std; int main() { int n,step=0; cin>>n; while(1){ if(n==1)break; else{ if(n%2==0){ n/=2; step++; } else { n=(3*n+1)/2; step++; } } } cout<<step<<endl; return 0; } JAVA代码
import java.util.*; public class Main { public static void main(String[] args) { int n,step=0; Scanner reader=new Scanner(System.in); n=reader.nextInt(); reader.close(); while (n!=1){ if(n%2==0){ n/=2; step++; if(n==1){ break; } } else{ n=(n*3+1)/2; step++; } } System.
本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊(N+1)/2⌋大的元素。其中集合元素的类型为自定义的ElementType。
函数接口定义: ElementType Median( ElementType A[], int N );
其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型。
裁判测试程序样例: #include <stdio.h> #define MAXN 10 typedef float ElementType; ElementType Median( ElementType A[], int N ); int main () { ElementType A[MAXN]; int N, i; scanf("%d", &N); for ( i=0; i<N; i++ ) scanf("%f", &A[i]); printf("%.2f\n", Median(A, N)); return 0; } /* 你的代码将被嵌在这里 */ 输入样例: 3
12.3 34 -5 输出样例:
12.30
求中位数嘛,先排序然后取中间位置的数即可(从题目要求可知取下界)
接着……怎么改都翻车了呵呵( ̄▽ ̄)"
**错误示范:** ElementType Median( ElementType A[], int N ){ int i,j; int temp; int p; int count=(N+1)/2; for(i=0;i<=N-1;i++){ temp=i; for(j=i+1;j<N;j++){ if(A[j]<A[temp]){ temp=j; } } if(temp!
apk download : https://www.taptap.com/app/202356
Video Demo : https://www.bilibili.com/video/BV1vK4y177U6/
ScratchLottery 一款由Unity开发的RTS类型的游戏,游戏的核心玩法为派遣士兵攻占城堡获取胜利。(该玩法思路来源于作者很早之前玩过的一款游戏,名字已经忘记,感谢朋友的试玩,提出了很多好的修改意见)
游戏开发至1.0版本耗时一周左右,开发时的指导思想即为轻美工、轻剧情、强玩法、强操作。游戏英文名暂定为ScratchLottery,因为添加战斗迷雾后,配合上像素风界面,战斗时酷似刮彩票。\o/
代码:https://github.com/Iamttp/Castle
游戏演示 游戏界面 技术分割线,下面的讨论涉及游戏本身所使用的技术。
游戏目录 Prefabs文件夹: 包含道路(go)、城堡(house)、不可移动道路(stop)、士兵(Sphere)、雾(fog)、顶部势力图(cube)预制体。
Resources文件夹: 包含道路(go)、不可移动道路(stop)、雾(fog)、顶部势力图(cube)纹理。
Materials文件夹: 包含道路(go)、不可移动道路(stop)、雾(fog)、城堡(New Material 1)、闪烁城堡(New Material 3)材质。
Shaders文件夹: 包含城堡(NewUnlitShader)、闪烁城堡(SelectShader)材质。
Scenes文件夹: 包含六大场景
Scripts文件夹: 包含六大场景文件夹,里面存放场景对应的C# Script。
关键技术分享 作者刚学Unity,很多效果都是通过直觉(做过GUI程序、OpenGL程序)做出来的,有更好的实现方法欢迎批评指正。游戏虽然表现为2D,但是项目创建时为Unity 3D。
像素风雾效果 首先想到的是在shader里面定义一个Color和一个int变量,
在C#脚本里面初始化一个对应图的二维bool数组表示当前位置是否有雾效果,
在Update里面遍历每一个点,如果为false表示有雾,设置Shader的int变量为1,让Shader的输出颜色为指定的Color(雾颜色),如果为true表示没有雾,设置Shader的int变量为0,让Shader的输出颜色为原本的纹理颜色。
实现时发现比较繁琐,于是采用了第二种方法,用GameObject的SetActive来控制是否开启雾。这种方法简单统一,且便于修改。
还是在C#脚本里面初始化一个对应图的二维bool数组表示当前位置是否有雾效果,在Update里面遍历每一个点,如果为false表示有雾,设置雾的预制体SetActive为true。反之false。
顶部势力图 首先用unity提供的UI控件很难自定义出想要的效果。(应该不能魔改滚动条吧)
而如果直接是在游戏场景中则会发生位置的变化。于是用另一个摄像头在距离很远处,将结果渲染至纹理。
再在主摄像头的UI里面,定义RAW IMAGE显示纹理。
势力图的每个Cube表示一个城堡,通过计算当前城堡数,设置相应的scale。
随机技能 过关后会有随机三个技能提示选项(我的思路来源于崩坏3)。
在一堆技能中做到随机三个,使用洗牌算法在O(N)时间复杂度 O(1)空间复杂度下随机打乱。然后选取前三个就行。
随机地图生成 城堡随机的生成,首先是固定4个势力分布在4个角,保证每个角城堡数相同,for循环城堡数 %4 就行。
生成时,参考八皇后放置算法,设置城堡四周为不可放置,放置城堡过于密集。
因为考虑到地图太小,后放置的城堡放不下,设定一个运行尝试次数,达到次数后,重新加载场景,重新生成。
道路随机的生成,随机选取两个城堡,使用绘制直线方法绘制(用的斜率绘制法,布雷森汉姆直线算法更好),
绘制时为保证不出现道路割裂感,在位置偏移时,多绘制一个转角。
为保证生成的地图质量,检测生成的直线是否存在交叉,存在交叉时,该条道路放弃生成。
在生成后,进行检测,从任一城堡出发,通过DFS遍历,若遍历后城堡数不为总城堡数,则表明存在孤立的城堡,重新加载场景,重新生成。
打包APK网盘链接,欢迎大家批评指正:
链接:https://pan.baidu.com/s/1M2PLkdbvAW-NQ1y-_ZFqBA
提取码:aaaa
复制这段内容后打开百度网盘手机App,操作更方便哦
2020-10-30更新:
WaterFlow 最新2.0版更名为Water Flow。游戏的核心玩法未变,游戏的迷雾由之前的GameObject遮挡改为点光源光照。
WebRTC(Web Real-Time Communication)即网页即时通信,是一个支持网页浏览器进行实时语音对话或视频对话的API。
WebRTC共分成三个API
1.MediaStream (又称getUserMedia)【获取音频和视频】
2.RTCPeerConnection【进行音频和视频通信】
3.RTCDataChannel【进行任意数据的通信】
卷积神经网络中的填充(padding)和步幅(stride) 之前写过一篇blog,描述CNN网络层的输入和输入尺寸的计算关系,但是并没有描述的很全面,这里全面描述了影响输出尺寸的两个超参数padding和stride,查阅了相关资料,编码理解了pytorch中CNN网络的输入输出关系。
对于CNN网络,一般来说,假设输入形状是 n h × n w n_h\times n_w nh×nw,卷积核窗口形状是 k h × k w k_h\times k_w kh×kw,那么输出形状将会是
( n h − k h + 1 ) × ( n w − k w + 1 ) . (n_h-k_h+1) \times (n_w-k_w+1). (nh−kh+1)×(nw−kw+1).
所以卷积层的输出形状由输入形状和卷积核窗口形状决定。卷积层还有两个超参数,即填充和步幅。它们可以对给定形状的输入和卷积核改变输出形状。
填充(padding) 填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)。
对于输入:
i n p u t = [ 0 1 2 3 4 5 6 7 8 ] input = \begin{bmatrix} 0 & 1 & 2 \\ 3 & 4 &5 \\ 6 & 7 & 8 \end{bmatrix} input=⎣⎡036147258⎦⎤
前言 启动是 App 给用户的第一印象,启动越慢用户流失的概率就越高,良好的启动速度是用户体验不可缺少的一环。启动优化涉及到的知识点非常多面也很广,一篇文章难以包含全部,所以拆分成两部分:原理和实战。
本文从基础知识出发,先回顾一些核心概念,为后续章节做铺垫;接下来介绍 IPA 构建的基本流程,以及这个流程里可用于启动优化的点;最后大篇幅讲解 dyld3 的启动 pipeline,因为启动优化的重点还在运行时。
基本概念 启动的定义 启动有两种定义:
广义:点击图标到首页数据加载完毕
狭义:点击图标到 Launch Image 完全消失第一帧
不同产品的业务形态不一样,对于抖音来说,首页的数据加载完成就是视频的第一帧播放;对其他首页是静态的 App 来说,Launch Image 消失就是首页数据加载完成。由于标准很难对齐,所以我们一般使用狭义的启动定义:即启动终点为启动图完全消失的第一帧。
以抖音为例,用户感受到的启动时间:
Tips:启动最佳时间是 400ms 以内,因为启动动画时长是 400ms。
这是从用户感知维度定义启动,那么代码上如何定义启动呢?Apple 在 MetricKit 中给出了官方计算方式:
起点:进程创建的时间
终点:第一个CA::Transaction::commit()
Tips:CATransaction 是 Core Animation 提供的一种事务机制,把一组 UI 上的修改打包,一起发给 Render Server 渲染。
启动的种类 根据场景的不同,启动可以分为三种:冷启动,热启动和回前台。
冷启动:系统里没有任何进程的缓存信息,典型的是重启手机后直接启动 App
热启动:如果把 App 进程杀了,然后立刻重新启动,这次启动就是热启动,因为进程缓存还在
回前台:大多数时候不会被定义为启动,因为此时 App 仍然活着,只不过处于 suspended 状态
那么,线上用户的冷启动多还是热启动多呢?
答案是和产品形态有关系,打开频次越高,热启动比例就越高。
Mach-O Mach-O 是 iOS 可执行文件的格式,典型的 Mach-O 是主二进制和动态库。Mach-O 可以分为三部分:
Header
Load Commands
在今年上半年发布的一系列旗舰新机当中,小黑发现了一个有意思的趋势,国产手机除了在屏占比、摄像头等方面下功夫之外,也开始有厂商在手机分辨率上下功夫了。继一加7 Pro之后,OPPO Find X2 Pro、一加8 Pro也都用上了2K分辨率的手机显示屏。那么问题来了:同样都是手机显示屏,1080P和2K的差距究竟在哪里?
今年上半年发布的旗舰机对于不少手机爱好者来说,多少可能会有点意难平。尽管很多旗舰手机都用上了比上代性能更强的处理器、提升了自己的拍照水平......各个方面或多或少都有进步的时候,手机的屏幕分辨率却多少有点拉胯,大部分的旗舰手机还是雷打不动的使用着祖传的1080P显示屏,只有三星、一加、OPPO等少数厂商在自家的手机上用上了2K分辨率的手机屏幕。那么大家为什么会这么在意这两者之间的差异呢?今天小黑就和大家来聊一聊2K和1080P的那些事儿。
▲ 今年的两款国产2K旗舰:一加8Pro和OPPO FindX2 pro
我们都知道手机屏幕图像的显示都是由许多像素点排列组成的,屏幕分辨率就代表着像素个数,当用手机屏幕中横向的像素点与纵向的像素点相乘的时候,其比值就是手机屏幕的分辨率了。例如720P表示屏幕有720行的像素,一般分辨率为1280*720;1080P则表示屏幕总共有1080行像素数,一般分辨率为1920*1080。
而2K分辨率是水平分辨率具有约2000像素的显示设备或者内容的通用术语,标准为2048×1080。同时,2K屏分辨率还有多种类别,如2048×1536(QXGA)、2560×1600(WQXGA)、2560×1440(Quad HD)等,也都是2K当中的一种。具体到手机屏幕上,常见的2K分辨率具体数值为2560×1440,以此类推4K、8K分辨率,也是同样的道理。一般情况下,手机屏幕的分辨率越高,画面显示效果就越精细,显示的细节也会越多,因此消费者都倾向于选择屏幕分辨率高的手机。
那么1080P和2K之间究竟存在着怎样的差异呢?
2K:更好的显示效果 在很多“2K党”的心中,在手机上使用2K屏幕可以带来更清晰的显示效果,毕竟从分辨率参数上来看,2K(2560*1440)分辨率的像素量约为720p(1280*720)的4倍,大约是1080p(1920*1080)分辨率的1.8倍,因此使用2K显示屏的手机,大家在刷微博、看小说的时候,通过仔细观察就会发现,它上面的字体的边缘过渡会十分自然,毫无锯齿感。
▲ 不同分辨率之间的差距还是很明显的
同时因为目前所有的主流旗舰手机采用的都是使用Pentile排列的AMOLED屏幕,而在AMOLED屏幕上面ppi(像素密度)会出现衰减,所以在使用1080P分辨率的AMOLED屏上,如果仔细看的话,它的颗粒感对比2K显示屏还是要明显一些,因此才会流传出“无2K不A屏”这句话。
▲ 采用Pentile排列明显要模糊不少
因此手机使用高分辨率的屏幕能够让手机的显示效果更加细腻化,当我们在看那种高分辨率的照片的时候,就能够在放大的时候看到更多的细节,从而让我们看到的显示内容更加细腻和丰富。总之一句话,当图像尺寸一样的情况下,分辨率差别大的屏幕,显示图像的清晰度是截然不同的,分辨率越高,图像细节越丰富。
1080P:目前的最优选择 尽管2K显示屏在显示效果上有着明显的优势,但是采用1080P分辨率的显示屏同样有着自己的长处。首先随着AMOLED屏幕的不断发展,1080P的显示效果也得到了很大的改善,对于普通用户来说如果不仔细看的话,可能根本分辨不出来1080P和2K之间的区别。
毕竟一直以来手机的分辨率其实并不是显示效果的衡量标准,ppi(像素密度)才是,如果一块屏幕达到了一定数量的ppi就已经算是够用了,比如现在流行的全面屏旗舰手机ppi达到326就完全够用了,如果高于这个数值的话,那么显示效果就可以用优秀来形容了。
而且随着现在的手机屏幕尺寸越做越大,屏幕的显示效果也越来越好,如今的手机1080P的屏幕几乎算是标配了,即使是千元机也基本上都采用了1080P的屏幕,可以说1080P的分辨率已经完全满足我们看电影玩游戏的使用需要了。
毕竟我们平时使用主流的视频软件,它们大部分的清晰度都只是1080P的,2K的资源几乎很少,因此即使我们用上了2K分辨率的手机屏幕,但是如果不凑近仔细观看的话,也是很难发挥出2K的优势。
厂商们的选择 既然1080P已经这么好用了,那么为什么像三星、索尼、一加这些厂商们还要在手机上使用2K分辨率的手机屏幕呢?
首先是因为尽管很多人表示对于2K感知不强,但是不可否认的是在某些使用场景下2K确实要比1080P的显示效果要好很多,整体的显示效果要更加清楚、细腻。
同时也是为了和其他厂商进行区分,给自己打造新的卖点。毕竟智能手机早在2014年就已经步入了1080P的时代。之后的主流手机旗舰就一直坚持着1080P的分辨率,一连几年都没怎么升级分辨率了,难免会让一些手机玩家们吐槽。而这些厂商们选择使用2K显示屏,一方面可以提升自家手机品牌的整体形象,展现自己的技术实力和品牌影响力,同时也可以起到一个引领的作用,让更多的厂商加入进来。
▲ 索尼Xperia1 II已经用上了4K的屏幕
而凡事都有两面性,在坚持使用1080P的手机厂商们看来,屏幕分辨率也不是越高越好。对于死守1080P分辨率这件事儿他们也有自己的理由。首先就是从使用成本上考虑,如今随着1080P的普及,它的价格相对于2K分辨率的屏幕而言相对较低,方便他们进行大规模的采购和使用。而更高分辨率的屏幕需要的材料成本也更高,这也是采用2K屏幕的手机售价普遍偏高的一大原因,有些质量比较好的2K屏幕的成本甚至高过处理器。此外2K分辨率的屏幕目前不但价格比较昂贵而且产能相较于1080P的屏幕明显要低上不少。
同时2K屏幕在日常使用中比较耗电,对于手机的续航来说是一个不小的挑战。在开启2K分辨率的情况下,的确会比1080P的更耗电一些,这也是一直以来很多手机厂商没有选择使用2K分辨率的原因。而且今年发布的主流旗舰还用上了90Hz和120Hz的高刷新率,如果再使用2K屏幕的话,以目前手机的电池容量来看,即使拥有快充的加持它们在续航上依旧很难拥有和1080P一样的完美体验。
总之出于不同的考量,各大手机厂商们纷纷做出了自己的选择。
用户们的看法 这边厂商们在屏幕的取舍上各有打算,那边儿用户们在对于屏幕的选择上同样有着自己的看法。
▲ 双方粉丝各抒己见
针对2k屏幕和1080p屏幕究竟有什么差别这个问题,小黑还特地采访了身边朋友和同事们的看法,而他们也根据自己的使用喜好进行了回答。
我的同事小张表示他是个忠实的2K党,他现在用的手机就是一加7Pro。之前他用过1080P分辨率的手机,经过他的使用体验和仔细对比,他觉得2K屏幕比1080p屏幕要清楚、细腻。在均衡续航和屏幕素质后,他甚至表示不建议大家尤其是视力不好的人购买1080P的手机,一副非2K不用的模样。
▲ 一加7Pro
我的朋友小王则对于2K分辨率的显示屏嗤之以鼻,他表示以当前的显示水平除非我们拿着专业设备去仔细观察,否则是很难发现它们之间的区别的。目前能够体现出2K优势的地方是少之又少,1080P已经能够满足我们日常的大部分需求了,厂商们与其在2K上面徒增功耗,不如想办法在其他方面多下一点功夫。
▲ 搭载2K屏幕的Note 10+
而小黑自己目前使用的手机就是三星的Note 10+,而当初之所以选择它其实就是奔着它的屏幕去的。尽管目前的手机应用似乎还无法将它屏幕的优势完全发挥出来,但是这并不意味着2K屏幕在手机上就真的一点优势都没有。毕竟2K的显示效果远比1080P的要更加精细这是无可辩驳的事实。特别是在看小说、刷微博的时候,2K屏幕细腻程度确实要好很多,小黑认为在这一点上2K的感知其实挺强的,并不像很多人说的那样除了徒增功耗之外一无是处。
至于我们在日常使用的时候是选择1080P的屏幕还是采用2K分辨率的屏幕,这就看大家自己的选择了。不过小黑觉得从过去的480P、720P,到如今的1080P乃至2K,手机的分辨率都是在不断提升和发展的。小黑也希望在今年下半年的旗舰手机中能够有更多的厂商能把2K的屏幕带给用户,就像三星、一加、OPPO那样让用户自己去选择想要的会更好。归根结底就是一句话我可以不用,但你不能没有。如果大家真的对于2K感知不强的话,大不了到时候自己调回1080P就是了。
对于 iPhone 的快捷指令,相信大家都不陌生了,快捷指令可以让你的 iPhone 更方便,那今天堂堂给大家分享,利用自动化功能,让你的 iPhone 在关闭闹钟后,自动播放网易云音乐,迎接美好的一天。
首先,你需要下载「快捷指令」App,还需要有「网易云音乐」App。
第一步:
打开「网易云音乐」App,在「账号」页面中,找到「添加 Siri 捷径」并点击。如果你没有看到 「添加 Siri 捷径」选择的,你需要更新 「网易云音乐」App 最新版。
在「添加 Siri 捷径」界面里,有五个选择,你可以选择你自己经常听的分组并点击「添加到 Siri」,例如「播放我喜欢的音乐」。
第二步:
添加成功后,打开「快捷指令」App ,在「自动化」界面中,点击右上角的「+」按钮,选择「创建个人自动化」。
选择日程列表中的「闹钟」,这里有两个选择,根据自己的情况来选择,如果你的闹钟响了,一般会按「稍后提醒」再睡一会再起床的,你就可以选择「设为稍后提醒时」,如果你闹钟一响就起床的,则可以选择「停止时」接口。
如果你想所有的闹钟响起都播放音乐的,下面这里选择「任一」,那如果你只想选择其中一个闹钟生效,那么可以选择「现有」,然后在现有的闹钟中选择一个,并点击「下一步」。
然后点击「添加操作」按钮,再点击「App」,在 App 列表中找到「网易云音乐」并点击。
点击第一步添加的网易云快捷指令,这里需要把「运行时显示」关闭,再点击「下一步」。
到这里,需要把「运行前询问」按钮关闭掉,再点击右上角的「完成」即可。
完成以上设置,当你的起床闹钟响起后,手机就会自动播放「网易云音乐」里你喜欢的歌曲了。
那些很能睡的小伙伴,赶紧设置一下了,音乐建议选“嗨”一下的~
标配 6G 运存的新 iPad Pro 跑分/苹果官网限购
iOS 13.4 GM 版更新/从新版 iPad Pro 看到 iPhone12 的新改变~
有锁 iPhone 可以完美解锁了 ,iccid 解锁复活
iPhone 6s 与 11 Pro 运行速度有多大差距?实测告诉你!
任意安装 + 复活 :失效、掉签软件教程,无视证书,无需越狱!
最近很长时间都很忙,写这篇主要是挂一下代码。
A略
B略
C.攀登山峰
样例输入复制
8 3 1 2 1 4 4 5 3 3 3 7 5 1 4 3 3 8 6 样例输出复制
4 1 4 题解:
std:
/**/ #include <cstdio> #include <cstring> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> #include <map> #include <set> #include <vector> #include <string> #include <stack> #include <queue> typedef long long LL; using namespace std; const int maxn = 1e5 + 5; int n, m, cnt, a[maxn], b[maxn], rt[maxn]; int tr[maxn << 5], ls[maxn << 5], rs[maxn << 5]; void build(int &now, int l, int r){ tr[now = ++cnt] = 0; if(l == r) return ; int mid = (l + r) >> 1; build(ls[now], l, mid); build(rs[now], mid + 1, r); } void up(int now){ tr[now] = tr[ls[now]] + tr[rs[now]]; } void update(int &now, int &old, int l, int r, int w){ tr[now = ++cnt] = tr[old] + 1; ls[now] = ls[old], rs[now] = rs[old]; if(l == r){ // tr[now]++; return ; } int mid = (l + r) >> 1; if(mid >= w) update(ls[now], ls[old], l, mid, w); else update(rs[now], rs[old], mid + 1, r, w); // up(now); } int query(int now, int old, int l, int r, int num){ if(l == r) return l; int mid = (l + r) >> 1; int res = 0; if(tr[ls[old]] - tr[ls[now]] > num){ res = max(res, query(ls[now], ls[old], l, mid, num)); } if(tr[rs[old]] - tr[rs[now]] > num){ res = max(res, query(rs[now], rs[old], mid + 1, r, num)); } return res; } int main() { //freopen("
androidx库是谷歌在两年前推出的用于取代support库的一个库,最低兼容API 28,也就是说28以上的默认使用androidx库,之前的support库都不再适用了。如果你不懂support库有哪些内容,以及如何迁移到androidx?可以看看我之前写的文章 《AndroidX库和一般库的详细对比以及迁移中遇到的坑总结》。
言归正传,下面我带领大家来看看androidx库是如何做到兼容低版本的。
首先我们这里有一个MainActivity,它是继承自androidx.appcompat.app.AppCompatActivity,但是AppCompatActivity源码太多,从头到尾去看会一脸懵逼,所以我们可以换一种最简易的思路去看源码。我们先看看我们创建项目之后默认的MainActivity里面的代码是什么样的:
package com.lzw.androidx_demo; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 我们看到默认的代码重写了onCreate函数,调用了父类(AppCompatActivity)的onCreate函数,我们点击去看看:
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { final AppCompatDelegate delegate = getDelegate(); delegate.installViewFactory(); delegate.onCreate(savedInstanceState); super.onCreate(savedInstanceState); } 首先它调用了getDelegate()方法,返回一个AppCompatDelegate对象,调用了delegate的onCreate方法,最后再调用父类的onCreate方法。
我们就从生命周期方法开始看,再看看其它的相关方法,我们会发现都首先调用了getDelegate(),返回一个AppCompatDelegate对象。源码摘抄如下:
@Override protected void onStart() { super.onStart(); getDelegate().onStart(); } @Override protected void onStop() { super.onStop(); getDelegate().onStop(); } @Override protected void onDestroy() { super.
目录 1 前言2 正文2.1 基本使用 3 最后 1 前言 在查看 google 的开源项目 sunflower 时看到使用到了 ListAdapter,开始以为是之前对应 ListView 的那个 ListAdapter,实际上是 recyclerview 库里提供的。自己也就跟着使用到了项目中。当然,经历了一些问题后,才比较好地掌握了 ListAdapter 的正确使用方法。
本文主要会回答如下的问题:
为什么提供同样引用的集合给 ListAdapter后,没有任何反映?为什么使用 ListAdapter 来实现数据的增加,删除,更新,会出现不按预期操作的情况?DiffUtil.ItemCallback 抽象类的两个抽象方法怎么用?使用 ListAdapter 如何获取数据提交成功的回调? 2 正文 2.1 基本使用 通过一个列表展示条目,加载更多展示数据的增加操作,选择删除展示删除操作。
我们的例子是这样的:
就是展示一系列带数字的卡片。
下面我们先过一下代码:
首先是数据类:
class Item(val number: Int, val colorRes: Int, var selected: Boolean = false) { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as Item if (number !
maven项目 SSM整合步骤(先前端、后后端)
首先创建一个maven项目在pom.mxl中添加war这样项目就能达成war包了。
在main新建webapp,如果pom.xml中不加war,webapp文件夹的颜色是不一样的,只有像我这样才行,然后创建WEB-INF,web.xml
整合ssm项目前先把需要的jar包全部导入
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>项目组名</groupId> <artifactId>项目名</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.6.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.18</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>javax.