android开发中知识点记录Word文档格式.docx
- 文档编号:6375238
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:12
- 大小:72.38KB
android开发中知识点记录Word文档格式.docx
《android开发中知识点记录Word文档格式.docx》由会员分享,可在线阅读,更多相关《android开发中知识点记录Word文档格式.docx(12页珍藏版)》请在冰点文库上搜索。
LinearLayout.LayoutParamsparams=newLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(color);
returnstatusBarView;
}
6.0以上系统权限动态申请
在Android6.0中,引入了动态申请权限机制。
以前我们在申请权限的时候,都是写在了Manifest.xml里面。
安装的时候会有一堆提示申请权限的界面,
请注意,如果你使用了API23以上,然而并没有用代码处理权限问题。
那么你的程序将会CRASH!
!
需要动态申请的,也称为危险权限。
先通过
=Build.VERSION_CODES.M)判断系统sdk是否大于6.0(23)
在通过
ContextCompat.checkSelfPermission(@NonNullContextcontext,@NonNullStringpermission)检测权限是否允许,提示和拒绝时,返回-1,允许时返回0
返回-1时,通过ContextCompat.requestPermission(context,String[]{}permissions)
来申请权限。
在activity的回调方法onRequestPermissionsResult获取申请结果
实例:
=23){
intpermiss=ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_FINE_LOCATION);
if(permiss!
=0){//没权限
ActivityCompat.requestPermissions(context,newString[]{Manifest.permission.ACCESS_FINE_LOCATION},requestCode);
}else{
//有权限,直接做业务逻辑
//权限是否成功回调@OverridepublicvoidonRequestPermissionsResult(intrequestCode,Stringpermissions[],int[]grantResults){switch(requestCode){case6:
{//权限申请成功if(grantResults!
=null&
grantResults.length>
0&
grantResults[0]==PackageManager.PERMISSION_GRANTED)//权限申请成功locationUtil.location(true);
}else{//MyToast.toast(getActivity(),"
定位权限申请失败,请到设置中设置允许"
}
7.0系统对第三方应用赋予对uri读写的权限
1.AndroidManifest.xml文件,添加provider标签,映射路径
1.<
provider
2.
android:
name="
android.support.v4.content."
<
/span>
3.
authorities="
包名.my"
//需要和代码中的字符串相同
4.
exported="
false"
5.
grantUriPermissions="
true"
6.
meta-data
7.
android.support."
8.
resource="
@xml/path_file"
/>
9.
/provider>
authorities:
是该项目的包名+provider
grantUriPermissions:
必须是true,表示授予URI临时访问权限
exported:
必须是false
resource:
中的@xml/是我们接下来要在资源文件目录下添加的文件
2.在res/xml下新建一个path_文件,文件名随便去,但是及上步骤一致即可。
?
xml
version="
1.0"
encoding="
utf-8"
>
2.<
resources>
paths>
--
代表的根目录:
Context.get()
cache-path/>
代表的根目录:
getCacheDir()
external-path/>
Environment.getExternalStorageDirectory()
external->
Context.getExternal(String)
Context.getExternal(null).
external-cache-path
Context.getExternalCacheDir().
10.
root-path
代表设备的根目录new
File("
/"
11.
-->
12.
—path="
"
|"
."
代表根目录|根目录下所有文件,也可以指定特定目录,name="
camera_picture"
是虚拟目录camera_picture
13.
root"
path="
//根目录下所有文件
14.
files"
15.
cache-path
cache"
16.
external-path
external"
17.
external-
external_files"
18.
external_cache"
19.
/paths>
20.<
/resources>
path:
需要临时授权访问的路径(.代表在相机调用时候访问的是所有路径,而文件写入时访问的路径是Android/data/com.ijuyin.prints.news/)
name:
是你为设置的这个访问路径起的名字
3.代码中动态获取URI
调用相机实例:
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
UrimOriginUri=null;
=Build.VERSION_CODES.N){intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Stringauthority=getActivity().getPackageName()+"
.my"
;
//这里需要和上面部分字符串相同
mOriginUri=(activity,authority,tempFile);
}else{mOriginUri=Uri.from);
intent.putExtra(MediaStore.EXTRA_OUTPUT,mOriginUri);
startActivityForResult(intent,PHOTO_REQUEST_TAKEPHOTO);
调用系统安装程序实例:
Intentintent=newIntent(Intent.ACTION_VIEW);
//判断是否是AndroidN以及更高的版本if(Build.VERSION.SDK_INT>
=Build.VERSION_CODES.N){
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
.my"
UricontentUri=(context,authority,apkfile);
intent.setDataAndType(contentUri,"
application/vnd.android.package-archive"
}else{
intent.setDataAndType(Uri.from),"
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
View触摸事件传递
介绍AndroidTouch事件的传递机制。
不少朋友私信问到这个问题,那就推荐一篇我看到的对传递机制介绍最清楚的国外文章吧。
本文略作翻译。
1、基础知识
(1)所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置、时间、历史记录以及第几个手指(多指触摸)等。
(2)事件类型分为ACTION_DOWN,ACTION_UP,ACTION_MOVE,ACTION_POINTER_DOWN,ACTION_POINTER_UP,ACTION_CANCEL,每个事件都是以ACTION_DOWN开始ACTION_UP结束。
(3)
对事件的处理包括三类,分别为传递——dispatchTouchEvent()函数、拦截——onInterceptTouchEvent()函数、消费——onTouchEvent()函数和OnTouchListener
2、传递流程
(1)事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。
子View可以通过onTouchEvent()对事件进行处理。
(2)事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。
(3)如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。
(4)如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。
(5)OnTouchListener优先于onTouchEvent()对事件进行消费。
上面的消费即表示相应函数返回值为true。
流程:
Events事件->
Activity.dispatchTouchEvent()->
(顶层)ViewGroup.dispatchTouchEvent()->
(顶层)ViewGroup.onInterceptTouchEvent()->
childView1.dispatchTouchEvent()->
childView1.OnTouchListener.OnTouch(如果定义了)->
childView1.onTouchEvent()->
childView2.....->
childViewn.....->
(顶层)ViewGroup.onTouchListener.onTouch()(如果定义了)->
(顶层)ViewGroup.onTouchEvent()->
Activity.onTouchEvent();
中间只要有返回true,事件即被消费掉,事件终止传递。
ScrollView,ListView,View等相互且套时,子view想单独处理触摸事件是,可子控件调用child.TonchEventListeren();
在回调中动态处理父控件拦截,通过parent.requestDisallowInterceptTouchEvent(boolean)方法来禁止父控件(ScrollView,ListView)拦截触摸事件,先让子控件处理触摸事件
child.setOnTouchListener(newView.OnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_UP:
parent.requestDisallowInterceptTouchEvent(false);
break;
default:
parent.requestDisallowInterceptTouchEvent(true);
}returnfalse;
});
动画
补间动画
1.LayoutAnimationViewGroup子控件的添加和上传动话
实现方式:
第一:
定义一个layoutAnimation的animation文件,如:
(anim/layout_animation.xml)
xmlversion="
encoding="
layoutAnimationxmlns:
android="
android:
delay="
1"
animationOrder="
normal"
animation="
@anim/slide_in_left"
第二步:
在viewGroup类型的控件中,添加android:
layoutAnimation=”@anim/layout_animation”,如:
ListView
id="
@+id/listview"
layout_width="
match_parent"
layout_height="
layoutAnimation="
@anim/layout_animation"
/>
以上两步就实现了ViewGroup中子控件添加和删除动画了。
GridLayoutAnimationGridView给内部子控件添加创建动画(anim文件夹下创建)
gridLayoutAnimationxmlns:
rowDelay="
75%"
columnDelay="
60%"
directionPriority="
none"
direction="
bottom_to_top|right_to_left"
@android:
anim/slide_in_left"
以上动画只有在第一次启动是有动画,后面没有。
在ViewGroup类控件XML中仅添加一行android:
animateLayoutChanges=true即可实现内部控件添加删除时都加上动画效果。
但却只能使用默认动画效果,而无法自定义动画。
为了能让我们自定义动画,谷歌在API11时,同时为我们引入了一个类LayoutTransaction。
1.LayoutTransitionmTransitioner
=
new
LayoutTransition();
2.//入场动画:
view在这个容器中消失时触发的动画
3.ObjectAnimator
animIn
ObjectAnimator.ofFloat(null,
rotationY"
0f,
360f,0f);
4.mTransitioner.setAnimator(LayoutTransition.APPEARING,
animIn);
6.//出场动画:
view显示时的动画
7.ObjectAnimator
animOut
rotation"
90f,
0f);
8.mTransitioner.setAnimator(LayoutTransition.DISAPPEARING,
animOut);
10.layoutTransitionGroup.setLayoutTransition(mTransitioner);
public
void
setAnimator(int
transitionType,
Animator
animator)
第一个参数inttransitionType:
表示当前应用动画的对象范围,取值有:
∙APPEARING——元素在容器中出现时所定义的动画。
∙DISAPPEARING——元素在容器中消失时所定义的动画。
∙CHANGE_APPEARING——由于容器中要显现一个新的元素,其它需要变化的元素所应用的动画
∙CHANGE_DISAPPEARING——当容器中某个元素消失,其它需要变化的元素所应用的动画
属性动画
ObjectAnimator是派生自ValueAnimator的,所以ValueAnimator中所能使用的方法,在ObjectAnimator中都可以正常使用,常用方法有ofInt(),ofFloat():
1.ObjectAnimator
animator
ObjectAnimator.ofFloat(tv,"
alpha"
1,0,1);
2.animator.setDuration(2000);
3.animator.start();
其中第二个参数是View中的get,set方法对应的属性。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 开发 知识点 记录