vectorandroid
❶ android 类图 intent 是什么关系
先看下java中对Vector的描述:(对Vector熟悉的下面这段可不看)
Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。
从 Java 2 平台 v1.2 开始,此类改进为可以实现 List 接口,使它成为 Java Collections Framework 的成员。与新 collection 实现不同,Vector 是同步的。
之前看think in java 中也有提到,Vector与List相比,主要的区别就在于,Vector是同步的,List是异步的,Vector在迭代的时候是不能对队里的数据进行增删操作的,否则会抛出异常,同理,在单一线程条件下,Vector的效率较之ArrayList等会更低,因此在Android平台下可能也不太会使用到该类。
下面就是重点了,先看下Vector的类图:
可以看到Vector是实现了Serializable接口的,所以很显然,Intent是可以传递这样的数据的,但是在实践中还是发现问题了,当我在Activity A中将Vector数据put进入intent的bundle中时,在Activity B中去取出数据(getSerializable)时,将其强转为Vector,程序会报错,cant Cast ArrayList to Vector(不能将Arraylist转换为Vector类型),见鬼了,后来去搜了下,stackflow上也有哥们问到这样的问题,有人猜测是所有Collection数据在进入Intent后,都被Android强转为Arraylist了,这里我还没有查询Android源码,但根据表现出来的问题也基本是这样的,哪位大神可以看下源码。
所以,结论就是,尽量不要在Android中使用Vector,如果确实因为线程同步的问题必须使用,那当你看到那个类转换异常时也不要惊讶,老老实实把它先用Arraylist盛放起来,再转回到Vector,或者程序的参数或者返回值接口不要写死为Vector,使用List这种泛型,这样也比较有利于程序的扩展。
❷ 安卓系统下是否有合适的矢量绘图平台,类似于台式电脑下的AutoCAD或VectorDrow之类 的
暂时没有,而且手机的屏幕尺寸有限,及时能设计也有限,处理器处理不到那么大得文件,何况我们双核电脑有时候还会卡。
❸ Android 中有哪些传感器的数据是可以分享的
着作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:肥肥鱼
来源:知乎
目前 Android 设备支持的传感器类型如下:
TYPE_ACCELEROMETER 加速度传感器又叫 G-sensor,该数值包含地心引力的影响,单位是 m/s2,测量应用于设备 x 、y、z 轴上的加速度。
将手机平放在桌面上,x 轴默认为0,y 轴默认0,z 轴默认9.81。
将手机朝下放在桌面上,z 轴为-9.81。
将手机向左倾斜,x 轴为正值。
将手机向右倾斜,x 轴为负值。
将手机向上倾斜,y 轴为负值。
将手机向下倾斜,y 轴为正值。
TYPE_AMBIENT_TEMPERATURE 温度传感器,单位是 ℃,返回当前的温度。
TYPE_GAME_ROTATION_VECTOR 用来探测运动而不必受到电磁干扰的影响,因为它并不依赖于磁北极。
TYPE_GEOMAGNETIC_ROTATION_VECTOR 地磁旋转矢量传感器,提供手机的旋转矢量,当手机处于休眠状态时,仍可以记录设备的方位。
TYPE_GRAVITY 重力传感器简称 GV-sensor,单位是 $m/s^2%,测量应用于设备X、Y、Z轴上的重力。在地球上,重力数值为9.8,
TYPE_GYROSCOPE 陀螺仪传感器叫做Gyro-sensor,返回x、y、z三轴的角加速度数据。单位是 radians/second。
TYPE_GYROSCOPE_UNCALIBRATED 未校准陀螺仪传感器,提供原始的、未校准、补偿的陀螺仪数据,用于后期处理和融合定位数据。
TYPE_LIGHT 光线感应传感器检测实时的光线强度,光强单位是lux,其物理意义是照射到单位面积上的光通量。
TYPE_LINEAR_ACCELERATION 线性加速度传感器简称LA-sensor。线性加速度传感器是加速度传感器减去重力影响获取的数据。单位是 m/s2。
TYPE_MAGNETIC_FIELD 磁力传感器简称为M-sensor,返回 x、y、z 三轴的环境磁场数据。该数值的单位是微特斯拉(micro-Tesla),用uT表示。单位也可以是高斯(Gauss),1Tesla=10000Gauss。硬件上一般没有独立的磁力传感器,磁力数据由电子罗盘传感器提供(E-compass)。电子罗盘传感器同时提供方向传感器数据。
TYPE_MAGNETIC_FIELD_UNCALIBRATED 未校准磁力传感器,提供原始的、未校准的磁场数据。
TYPE_ORIENTATION 方向传感器简称为O-sensor,返回三轴的角度数据,方向数据的单位是角度。为了得到精确的角度数据,E-compass 需要获取 G-sensor 的数据,经过计算生产 O-sensor 数据,否则只能获取水平方向的角度。方向传感器提供三个数据,分别为azimuth、pitch和roll:
azimuth: 方位,返回水平时磁北极和 Y 轴的夹角,范围为0°至360°。0°为北,90°为东,180°为南,270°为西。
pitch: x 轴和水平面的夹角,范围为-180°至180°。当 z 轴向 y 轴转动时,角度为正值。
roll: y 轴和水平面的夹角,由于历史原因,范围为-90°至90°。当 x 轴向 z 轴移动时,角度为正值。
TYPE_PRESSURE 压力传感器,单位是hPa(百帕斯卡),返回当前环境下的压强。
TYPE_PROXIMITY 接近传感器检测物体与手机的距离,单位是厘米。一些接近传感器只能返回远和近两个状态,因此,接近传感器将最大距离返回远状态,小于最大距离返回近状态。
TYPE_RELATIVE_HUMIDITY 湿度传感器,单位是 %,来测量周围环境的相对湿度。
TYPE_ROTATION_VECTOR 旋转矢量传感器简称RV-sensor。旋转矢量代表设备的方向,是一个将坐标轴和角度混合计算得到的数据。RV-sensor输出三个数据:
x*sin(theta/2)
y*sin(theta/2)
z*sin(theta/2)
sin(theta/2)是 RV 的数量级。RV 的方向与轴旋转的方向相同。RV 的三个数值,与cos(theta/2)组成一个四元组。
TYPE_SIGNIFICANT_MOTION 特殊动作触发传感器。
TYPE_STEP_COUNTER 计步传感器,用于记录激活后的步伐数。
TYPE_STEP_DETECTOR 步行检测传感器,用户每走一步就触发一次事件。
TYPE_TEMPERATURE 温度传感器,目前已被TYPE_AMBIENT_TEMPERATURE替代。
❹ 如何使用Android的VectorDrawable类绘制矢量图
绘制矢量图形非难事——如何使用Android的VectorDrawable类内容概述尽管Android系统并不能够直接支持SVG(即可缩放矢量图形),但Lollipop版本却引入了一个名为VectorDrawable的新类,其允许设计人员及开发人员以纯代码方式生成类似的绘制效果。在今天的文章中,我们将共同学习如何利用XML文件创建一个VectorDrawable,并将其以动画方式显示在自己的项目当中。这项功能只能在运行有Android5.0或者更高版本的设备上实现,而且目前还不具备任何支持库实现。本篇教程中的相关源文件可以通过GitHub网站获取。1.创建VectorDrawable从相似角度来看,VectorDrawable与标准SVG图形都是利用path值绘制完成的。不过如何利用SVGpath绘制图形并不在本篇文章的探讨范围之内,大家可以点击此处从W3C网站处获取必要的说明资料。在本文当中,我们只需要了解到path标签的作用是进行图形绘制即可。让我们首先从SVG文件入手,看看以下图形是如何被绘制出来的:这一图形共由五个主要部分所组成:一个圆角四边形作为CPU主体,该四边形由两条拱状弧线构成。四组各自包含五根线条的图形,用于充当CPU的外延线路。以下代码所示为如何以SVG方式绘制以上图形:虽然看起来有点繁杂,但大家其实用不着纠结于以上代码的具体含义,而且这完全不会影响到我们接下来要进行的VectorDrawable绘制工作。不过需要强调的是,我将前面提到的五大图形组成部分在代码中作为独立的区块来处理,这是为了增强代码内容的可读性。首先,我们需要利用两条拱形弧线来绘制出圆角四边形,而在接下来的内容中我们会探讨如何分别表现出上、下、左、右四个方位的外延线条。为了将上述SVG代码转化为VectorDrawable,大家首先需要在XML当中定义vector对象。以下代码提取自本篇文章示例代码当中的vector_drawable_cpu.xml文件。在此之后,大家可以向其中添加path数据。下列代码同样被拆分成了五个不同的path标签而非将其作为整体处理,这当然也是为了保证内容的可读性。正如大家所见,每个path片段都只需要利用pathData属性进行绘制。现在我们可以将VectorDrawableXML文件作为一个可绘制对象纳入到标准ImageView当中,而且其能够根据应用程序的实际需要任意进行尺寸缩放——完全不需要再修改任何Java代码。2.为VectorDrawables添加动画效果现在我们已经了解了如何以纯代码方式创建图形,接下来要做的是找点乐子——为其添加动画效果。在以下动画中,大家会发现作为延伸线路的各组线条会不断指向并远离CPU本体进行移动。为了达到这一目标,大家需要将包含动画效果的每个片段包含在一个标签当中。经过修改的vector_drawable_cpu.xml版本将如下所示:接下来,我们需要为每个动画类型创建animator文件。在本次示例中,每组线路各使用一个animator,这就意味着共需要四个animator。以下代码所示为上方线路的动画效果,大家还需要为下、左、右线路设定类似的效果。每个animatorXML文件都被包含在了本项目的示例代码当中。如大家所见,propertyName被设定为translateY,这意味着该动画将沿Y轴方向移动。而valueFrom与valueTo则控制着位移的起点与终点。通过将repeatMode设置为reverse而repeatCount设置为infinite,整个动画会一直循环下去,其效果则在VectorDrawable处体现出来。该动画的ration被设定为250,其时长单位为毫秒。为了将该动画应用到自己的可绘制文件当中,大家需要创建一个新的animated-vectorXML文件,从而将这些animator分配给各VectorDrawable组。以下代码的作用是创建该animated_cpu.xml文件。
❺ Android Support Library 23.2有哪些新东西
新特性:
支持Vector Drawable 和 Animated Vector Drawable
Vector drawables 让自己可以用一个定义在XML里的矢量图象替换多个png资源。而之前这一用法只局限于Lollipop以及更高的设备,VectorDrawable和AnimatedVectorDrawable现在可以分别通过两个新的支持库support-vector-drawable和support-animated-vector-drawable得到。
Android Studio 1.4 中介绍了一种通过在编译时生成png的办法对vector drawable提供了有限的支持。为了禁用这个功能(节省支持库的空间,真正受益于新的库),需要在 build.gradle文件里添加vectorDrawables.useSupportLibrary = true :
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
需要注意这个新的属性只有2.0版本的Gradle Plugin中才有。如果正在使用Gradle 1.5 ,则应该使用
// Gradle Plugin 1.5
android {
defaultConfig {
generatedDensities = []
}
// This is handled for you by the 2.0+ Gradle Plugin
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
可以使用兼容到API7的VectorDrawableCompat和兼容到API11或者更高的AnimatedVectorDrawableCompat。鉴于安卓加载drawable的方式,并不是每个接受drawable id的地方(比如在一个XML文件中)都支持加载vector drawable。幸好,AppCompat 添加了几个功能让自己更容易使用新的vector drawable。
首先,当自己和ImageView(或者例如 ImageButton 和 FloatingActionButton这样的子类) 一起使用AppCompat的时候,可以使用新的app:srcCompat属性来饮用 vector drawable(而任何其它drawable则用 android:src):
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" />
并且,如果要在运行时动态的改变drawable,可以使用和之前相同的 setImageResource() 方法 - 这点并没有变。使用AppCompat和app:srcCompat是在app中集成vector drawable最简单可靠的方式。
会发现在Lollipop之前直接在app:srcCompat之外引用vector drawable会失败。但是AppCompat却支持其它drawable 容器比如StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable, 或者 RotateDrawable加载vector drawable。使用这种间接的方法,可以在这种情况下使用vector drawable,比如TextView的android:drawableLeft 属性,本来在正常情况下,它是不支持vector drawable的。
AppCompat夜间白天主题
虽然在能各个版本的app中使用矢量图像已经是一个很大的变化了,但是这个版本还在AppCompat中添加了一个新主题:Theme.AppCompat.DayNight。
在API 14,之前,DayNight theme以及它的继承者DayNight.NoActionBar, DayNight.DarkActionBar, DayNight.Dialog等和light是一样的。但是在API 14 a或者跟高设备上,这个主题可以轻易的让app既支持Light又支持 Dark theme。可以根据是否为“night”从一个Light 主题切换到Dark主题。
默认情况下,是不是‘night’跟系统的值(从UiModeManager.getNightMode()得到)是对应的,但是可以使用AppCompatDelegate中的方法覆盖这个值。对于这个贯穿整个app(直到进程重启)的默认值,可以使用静态的AppCompatDelegate.setDefaultNightMode()方法去设置,或者可以通过getDelegate()得到一个AppCompatDelegate,并使用setLocalNightMode()去改变当前的Activity或者对话框。
当使用AppCompatDelegate.MODE_NIGHT_AUTO时,一天的时间和最近的地点(如果自己的app有地理位置权限)会被用于自动切换白天和黑夜,而MODE_NIGHT_NO和MODE_NIGHT_YES则分别用于强制主题从不或者总是使用dark theme。
在使用DayNight主题的时候,务必要彻底测试一下app,因为硬编码颜色容易造成可读性差的文字和图标(没看懂)。如果自己的text使用的是标准的 TextAppearance.AppCompat样式或者颜色是从主题里(比如从 android:textColorPrimary)得到的,会发现这些都会自动帮自己更新。
但是,如果想专门为夜间模式自定义任何资源,可以在AppCompat的 night resource qualifier folder(夜间资源目录)里自定义需要的任何资源。为了让对这个模式的支持变得更轻松,请考虑使用标准的颜色或者利用AppCompat的tinting (着色)。
Design Support Library: Bottom Sheets
Design Support Library 提供了许多 material design 设计模式的实现。这个版本让开发者可以轻松的把 bottom sheet 添加到他们的app中。
通过为 CoordinatorLayout的子View设置一个BottomSheetBehavior(比如:app:layout_behavior=”android.support.design.widget.BottomSheetBehavior”),将自动得到能在5个状态间切换的触摸检测功能:
STATE_COLLAPSED: 这是折叠状态 ,也是默认的状态。只是在底部边沿显示布局的一部分。其高度可以使用 app:behavior_peekHeight 属性来控制(默认是0)。
STATE_DRAGGING: 这是中间状态,此时用户直接上下拖动 bottom sheet。
STATE_SETTLING: 视图被释放之后-到达最终位置之间的瞬间。
STATE_EXPANDED: bottom sheet完全展开的状态。 整个bottom sheet都是可见的(如果它的高度小于包含它的CoordinatorLayout)或者整个CoordinatorLayout都是填满的。
STATE_HIDDEN: 默认禁用是的(使用app:behavior_hideable属性来启用 ), 如果这个启用,用户可以在 bottom sheet中下滑以完全隐藏bottom sheet
记住,bottom sheet 中的滚动容器必须支持嵌套滚动(比如,NestedScrollView, RecyclerView, 或者 API 21+上的ListView/ScrollView )。
如果想要收到状态的回调,可以添加一个BottomSheetCallback:
// The View with the BottomSheetBehavior View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setBottomSheetCallback(new BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
// React to state change
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
// React to dragging events
}
});
虽然BottomSheetBehavior针对的是 持久性型 bottom sheet 的情景,但是这个版本还提供了BottomSheetDialog 和 BottomSheetDialogFragment 来完成 模态 bottom sheets 的用例。把AppCompatDialog 或者 AppCompatDialogFragment替换成相应的bottom sheet版本即可。让自己的对话框使用bottom sheet风格的样式。
Support v4: MediaBrowserServiceCompat
Support v4 library 作为许多支持库的基础,包含了许多在较新版本中才引入的framework功能(以及几个独特的功能)。
在上个版本中添加的 MediaSessionCompat 类为媒体播放提供了坚实的基础,这个版本咱们添加了MediaBrowserServiceCompat 和 MediaBrowserCompat ,把最新的API(甚至是Marshmallow中添加的那些)向后兼容到API 4 及以上。这让支持Android Auto上的音频播放,Android Wear 上的媒体浏览变得简单多了。另外,还为连接media playback service和UI提供了一个标准的接口。
RecyclerView
RecyclerView 控件提供了灵活一种创建列表和网格的基本方案,而且还支持动画。这个版本为 LayoutManager API带来了一个非常激动人心的新特性:自动测量!让RecyclerView可以根据其内容的大小调整自己。这意味着以前那些无解的场景,比如对RecyclerView的一个dimension 使用WRAP_CONTENT成为了可能。会发现所有的内置LayoutManager现在都支持自动测量。
因为这个变化的原因,得仔细检查 item view的 layout parameters 了:以前会被自动忽略的 layout parameters(比如在滚动方向上的MATCH_PARENT ),现在会被完全考虑进去。如果有一个自定义的LayoutManager,且没有继承自内置的LayoutManager,那么这就是一个可选的API - 需要调用setAutoMeasureEnabled(true) 并且根据这个方法的Javadoc中的描述做一些微小的改变。
注意,虽然RecyclerView可以让自己的子View动画,但是它不能动画自己的边界改变。如果想要让RecyclerView的边界变化也呈现动画,可以使用 Transition API。
Custom Tabs
Custom Tabs 可以在保持app风格与外观的同时无缝切换到web内容页。而在这个版本中,可以向一个显示在web内容旁边的底部bar添加操作项。注:以前只能在顶部的溢出菜单里面添加。
有了新的addToolbarItem()方法,就可以添加最多5个(MAX_TOOLBAR_ITEMS)actions到bottom bar 上,并使用setToolbarItem() 来更新它们。类似于之前的setToolbarColor()方法,可以找到一个 setSecondaryToolbarColor()方法来自定义bottom bar的背景颜色。
Leanback for Android TV
Leanback 库给了把app带到Android TV上所需要的工具, 里面有许多专门为TV而优化的控件。这个版本的GuidedStepFragment 做了一些列重大改进。
最大的改变可能就是引入了action button的第二列(通过重写onCreateButtonActions()或者调用 setButtonActions()来添加)。不需要滚动完一个 GuidedActions列表就能到达所有的action。
说到GuidedAction,有几个让输入更佳丰富的新特性,包括editable descriptions (通过descriptionEditable()), 表单中dropdown里面的sub action(用subActions()),以及GuidedDatePickerAction。
❻ 如何自学 Android 编程
自学Android开发可以分阶段学习安排,由基础学起,在学习中可以能会遇到很多问题,这就需要多向别人请教解决了,自学会稍微吃力些,有人带学是最好不过的。学Android编程可以参照以下阶段来学习安排:
第一阶段:Java面向对象编程
1.Java基本数据类型与表达式,分支循环。
2.String和StringBuffer的使用、正则表达式。
3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化和回收;构造函数、this关键字、方法和方法的参数传递过程、static关键字、内部类,Java的垃极回收机制,Javadoc介绍。
4.对象实例化过程、方法的覆盖、final关键字、抽象类、接口、继承的优点和缺点剖析;对象的多态性:子类和父类之间的转换、抽象类和接口在多态中的应用、多态带来的好处。
5.Java异常处理,异常的机制原理。
6.常用的设计模式:Singleton、Template、Strategy模式。
7.JavaAPI介绍:种基本数据类型包装类,System和Runtime类,Date和DateFomat类等。
8.Java集合介绍:Collection、Set、List、ArrayList、Vector、LinkedList、Hashset、TreeSet、Map、HashMap、TreeMap、Iterator、Enumeration等常用集合类API。 9.Java I/O输入输出流:File和FileRandomAccess类,字节流InputStream和OutputStream,字符流Reader和Writer,以及相应实现类,IO性能分析,字节和字符的转化流,包装流的概念,以及常用包装类,计算机编码。
10.Java高级特性:反射、代理和泛型。
11.多线程原理:如何在程序中创建多线程(Thread、Runnable),线程安全问题,线程的同步,线程之间的通讯、死锁。 12.Socket网络编程。
第二阶段:Java Web开发
1.Java解析XML文件DOM4J。
2.MySql数据库的应用、多表连接查询的应用。
3.Jsp和Servlet应用。
4.Http协议解析。
5.Tomcat服务器的应用配置。
6.WebService服务配置应用。
第三阶段:android UI编程
1、Android开发环境搭建:Android介绍,Android开发环境搭建,第一个Android应用程序,Android应用程序目录结构。
2、Android初级控件的使用:
TextView控件的使用Button控件的使用方法EditText控件的使用方法ImageView的使用方法RadioButton的使用方法Checkbox的使用方法Menu的使用方法
3、Android高级控件的使用:
Autocompletion的使用方法ListView的使用方法GridView的使用方法Adapter的使用方法Spinner的使用方法Gallary的使用方法ScrollView的使用方法
4、对话框与菜单的使用:
Dialog的基本概念AlertDialog的使用方法DatePickerDialog的使用方法Menu的使用方法自定义Menu的实现方法
5、控件的布局方法:
线性布局的使用方法相对布局的使用方法表格布局的使用方法
6、多Acitivity管理:
AndroidManifest.xml文件的作用 Intent的使用方法使用Intent传递数据的方法启动Activity的方法IntentFilter的使用方法Activity Group的使用方法
7、自定义控件实现方法:
自定义ListView的实现方法可折叠ListView的使用方法自定义Adapter的实现方法自定义View的实现方法动态控件布局的上实现方法
第四阶段:android网络编程与数据存储
1、基于Android平台的HTTP通讯:
Http协议回顾Apache Commons 工具包介绍使用Get方法向服务器提交数据的方法解析服务器响应数据的方法使用POST方法向服务器提交数据的实现方法向服务器提交非文本数据的实现方法使用Http协议实现多线程下载使用Http协议实现断点续传
2、Android数据存储技术:
SQLite3数据库简介SQL语句回顾SQLite3编程接口介绍SQLite3事务管理SQLite3游标使用方法SQLite3性能分析访问SDCard的方法访问SharedPreferences的方法
3、ContentProvider使用方法:
ContentProvider实现共享数据、URI的解析与UriMatcher、ContentUris的使用、使用ContentResolver操作ContentProvider、ContentProvider的监听Android当中的异步操作:Handler的使用方法;异步任务的基本概念;AsyncTask的使用方法。
第五阶段:android手机硬件管理
1、地图及定位技术:GPS简介;LocationManager的使用方法;在Google Map上添加标记的方法;查询某地附近建筑的方法;使用Google Map实现点对点导航。
2、传感器使用方法:方向、加速度(重力)、光线、磁场、距离、温度等传感器的使用。
3、近场通信技术:NFC技术简介;NFC技术是用场景介绍;NFC技术实现方法。
4、媒体管理技术:MediaPlayer的使用方法。
5、触摸屏技术:手势识别;多点触摸技术。
第六阶段:Android图形编程技术
1、图形处理基础:2D图形编程基础;
2、点、线、面等基本图形元素绘制方法;
3、Android动画框架简介;
4、位移动画的实现方法;
5、淡入淡出动画的实现方法;
6、旋转动画的实现方法;
7、Matrix的使用方法。
第七阶段:Android游戏开发
1、Android游戏开发:Android游戏开发概述;
2、SurfaceView的使用方法;
3、物理小球技术;
4、碰撞检测技术;
5、图片、文字和背景音乐等资源的使用方法;
6、游戏引擎基础概念;
7、Cocoa2d-Android引擎使用方法;
8、OpenGL ES使用方法。
自学一般人会很难坚持下去,学习中遇到的问题解决效率不是很高,可以参加明确讲师授课的Android开发培训班,由资深高级讲师带领学习,和同学们共同学习,遇到问题互相解决,学习效率还是非常高的。
❼ android 中vector的用法 坑 怎么替代,关于这几方面的一些看法
在安卓的发展历程中,由于设备碎片化的原故,谷歌在app中图标的适配上做出一步又一步的改进,大体有这么几个阶段:
首先有了drawable-(m|h|xh|xxh|xxxh)dpi
自android studio后,又有了mipmap-(m|h|xh|xxh|xxxh)dpi
随着android L的发布,带来了VectorDrawable,矢量图的支持
第一种方案大家都很熟悉, 但也是我们头痛的地方,因为每种icon都需要出几套不同分辨率,这无形的增加了app的容量,而且也增加了美工和开发人员的工作量,但是我们又不得不去做。
❽ 如何玩转Android矢量图VectorDrawable
从5.0(API等级21)开始,android开始支持矢量图了。关于什么是矢量图以及矢量图有什么优缺点不在本文的涉及范围之内,具体可以参考矢量图网络。不过这里要提一下它的优点:
保存最少的信息,文件大小比位图要小,并且文件大小与物体的大小无关
任意放大矢量图形,不会丢失细节或影响清晰度,因为矢量图形是与分辨率无关的。
从以上两个优点来看,在项目中使用矢量图至少可以缩小我们apk包的尺寸,而且可以在屏幕适配时提供很大的方便,因为矢量图是分辨率无关的。
前面也说了,矢量图从21才开始支持。那么如果我想往下兼容改怎么办呢?这个问题要放在以前的话,我会说github下就有你要的答案。但现在我不会这么说,因为前段时间Google升级了support library,官方向后兼容了矢量图的使用。要问兼容到哪个版本,我告诉你矢量图兼容到API7,矢量图动画兼容到API11(是不是已经满足了你的使用)。
好了,下面我们就来说说怎么在项目中使用矢量图。
一、VectorDrawable的使用
按照官方的说法,要在低版本上使用矢量图,需要在项目中引入新的兼容库support-vector-drawable,并且appcompat-v7库的版本要在23.2.0+(写文章这会23.2.1已经发布了)。而且你还要修改下gradle的相关配置,不要让gradle在构建的时候为你在低版本(API21以下)的情况下生成针对于不同密度的png文件,因为android studio1.4的时候支持了矢量图。
修改appcompat-v7的版本
compile 'com.android.support:appcompat-v7:23.2.0'
NOTE: 这里我只引入了23.2.0版本的appcompat-v7库,同步gradle后就编译出了support-vector-drawable-23.2.0和animated-vector-drawable-23.2.0这两个库。
修改gradle配置文件
如果你的gradle插件的版本为2.0以下,你应该这么修改
android {
defaultConfig {
// 不让gradle自动生成不同屏幕分辨率的png图
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
如果你的gradle插件版本是2.0+,你 应该这么修改
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
经过上面这几步的修改,你就可以在项目中使用矢量图了。那么,下面我们就正式来说说怎么使用。
android studio为我们提供了一个Vector Asset Studio的工具,让我么可以从material icon和svg文件生成矢量图。具体用法可以参考官方的说明文档,这里就不多说了。
Android中矢量图是以xml文档的形式存在的,像下面这样就定义了一个矢量图,里面包含了关于该矢量图的数据信息。
<!-- res/drawable/heart.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z" />
</vector>
这是我通过material icon生成的,它在android中对应着VectorDrawable这个类,也就是兼容包中的VectorDrawableCompat这个类。
定义好矢量图形后,我们就可以向普通的图形那样来使用它了。不过有几点需要注意:
*使用android:src属性的地方需要替换为app:srcCompat属性
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.damon.vectordrawabledemo.MainActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_mood_black_24dp" />
</RelativeLayout>
*在非src属性的地方使用矢量图时,需要将矢量图用drawable容器(如StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable, 和RotateDrawable)包裹起来使用。否则会在低版本的情况下报错。
而在代码中的使用和普通的png图没什么区别,调用的是同样的API。
❾ android ndk编译jni vector<string> 怎么返回
加入头文件 #include 函数 __android_log_print(ANDROID_LOG_INFO,LOG_TAG,TITLE) 第一个参数ANDROID_LOG_INFO(还有ANDROID_LOG_ERROR等),表示什么类型 的输出,上面的函数相当于android的java代码的Log.i(LOG_TAG,TITLE),第二个参数就是logc...
❿ android源码里有哪些比较好的算法或框架推荐
Android中对于图形界面以及多媒体的相关操作比较容易实现。而且对于大多数
手机
用户来说,他们主要也就是根据这些方面的功能来对系统那个进行修改。我们可以通过本文介绍的Android多媒体框架的源码解读,来具体分析一下这方面的基本知识。
Android多媒体框架的代码在以下目录中:external/opencore/。这个目录是Android多媒体框架的根目录,其中包含的子目录如下所示:
* android:这里面是一个上层的库,它基于PVPlayer和PVAuthor的SDK实现了一个为Android使用的Player和Author。
* baselibs:包含数据结构和线程安全等内容的底层库
* codecs_v2:这是一个内容较多的库,主要包含编解码的实现,以及一个OpenMAX的实现
* engines:包含PVPlayer和PVAuthor引擎的实现
* extern_libs_v2:包含了khronos的OpenMAX的头文件
* fileformats:文件格式的据具体解析(parser)类
* nodes:编解码和文件解析的各个node类。
* oscl:操作系统兼容库
* pvmi: 输入输出控制的抽象接口
* protocols:主要是与网络相关的RTSP、RTP、HTTP等协议的相关内容
* pvcommon:pvcommon库文件的Android.mk文件,没有源文件。
* pvplayer:pvplayer库文件的Android.mk文件,没有源文件。
* pvauthor:pvauthor库文件的Android.mk文件,没有源文件。
* tools_v2:编译工具以及一些可注册的模块。
Splitter的定义与初始化
以wav的splitter为例,在fileformats目录下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目录下有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h, pvmf_wavffparser_port.h等文件。
我们由底往上看,vwavfileparser.cpp中的PV_Wav_Parser类有InitWavParser(),GetPCMData(),RetrieveFileInfo()等解析wav格式的成员函数,此类应该就是最终的解析类。我们搜索PV_Wav_Parser类被用到的地方可知,在PVMFWAVFFParserNode类中有PV_Wav_Parser的一个指针成员变量。
再搜索可知,PVMFWAVFFParserNode类是通过PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成员函数生成的。而CreatePVMFWAVFFParserNode()函数是在PVPlayerNodeRegistry::PVPlayerNodeRegistry()类构造函数中通过PVPlayerNodeInfo类被注册到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> 的vector中,在这个构造函数中,AMR,mp3等node也是同样被注册的。
由上可知,Android多媒体框架中对splitter的管理也是与ffmpeg等类似,都是在框架的初始化时注册的,只不过Opencore注册的是每个splitter的factory函数。
综述一下splitter的定义与初始化过程:
每个splitter都在fileformats目录下有个对应的子目录,其下有各自的解析类。
每个splitter都在nodes目录下有关对应的子目录,其下有各自的统一接口的node类和node factory类。
播放引擎PVPlayerEngine类中有PVPlayerNodeRegistry iPlayerNodeRegistry成员变量。
在PVPlayerNodeRegistry的构造函数中,将 AMR, AAC, MP3等splitter的输入与输出类型标示和node factory类中的create node与release delete接口通过PVPlayerNodeInfo类push到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> iType成员变量中。
当前Splitter的匹配过程
PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids)函数的功能是根据输入类型和输出类型,在已注册的node vector中寻找是否有匹配的node,有的话传回其唯一识别标识PVUuid。
从QueryRegistry这个函数至底向上搜索可得到,在android中splitter的匹配过程如下:
android_media_MediaPlayer.cpp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,供java代码中调用MultiPlayer类的setDataSource成员函数时找到对应的c++函数
1.{"setDataSource", "(Ljava/lang/String;)V", (void *)
android_media_MediaPlayer_setDataSource},
2.static void android_media_MediaPlayer_setDataSource
(JNIEnv *env, jobject thiz, jstring path)
此函数中先得到当前的MediaPlayer实例,然后调用其setDataSource函数,传入路径
3.status_t MediaPlayer::setDataSource(const char *url)
此函数通过调getMediaPlayerService()先得到当前的MediaPlayerService, const sp<IMediaPlayerService>& service(getMediaPlayerService());
然后新建一个IMediaPlayer变量, sp<IMediaPlayer> player(service->create(getpid(), this, fd, offset, length));
在sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url)中
调status_t MediaPlayerService::Client::setDataSource(const char *url)函数,Client是MediaPlayerService的一个内部类。
在MediaPlayerService::Client::setDataSource中,调sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType)
生成一个继承自MediaPlayerBase的PVPlayer实例。