
MiniMum Required SDK:最低支持的android api版本,低于这个版本的android手机不能安装你的应用
Target SDK:你的应用最高支持android api版本
Compile With:哪个版本的android
SDK(15~42)编译你的工程,也就是最适合的,最原生支持你的应用的android版本。
Theme :这个随意,主题选择
说白了:就是最小,最大,和最适合的问题。
10种技巧可提升Android应用运行效果
技巧1:从优秀的编程开始
要采用已为用户所接受的运算法则和标准的设计样式,这些被人们长期使用的编程法则也同样适用于Android应用,尤其当这些应用使用内在设备服务时。
比如,假设你编写的应用需要以地理定位服务为基础。只需要在必要时开始注册进行位置更新,在无需更新信息时,确保应用停止更新进程。这会帮助节省设备的电量和系统处理器的负担。
技巧2:保持应用的灵活性
通过使用AsyncTask、IntentService或自定义背景服务来保持应用的灵活性。使用加载器来简化加载时间较长数据的状态管理,比如光标。不可让应用在其他进程进行时显得缓慢或完全静止。
如果某些 *** 作需要一定的时间和资源,应当将这个进程单独分离出来异步处理,这样你的应用才能够保持流畅的运行。可以运用这种方法的 *** 作包括:磁盘读写,访问内容供应方、数据库和网络,其他需要较长时间的任务。
技巧3:使用最新的Android SDK版本和API
保持应用的更新,使用Android平台提供的最新内容。随着Android平台的发展,它也在逐步改善中。某些功能被移除,或者替换成更好的选项。其核心API中的漏洞已修复,整个API性能已得到提升。该平台已引入装载器之类的新API,帮助开发者编写更为稳定和反应灵敏的应用。
Android
30应用支持硬件加速,你可以加以应用。应当理解的是,最佳的表现情况会随着时间逐渐改变。睿智的开发者会更新平台发布的最新内容和API。
技巧4:检查Strict Mode
你可以使用称为“StrictMode”的Android
API来查找编程中的问题。StrictMode会帮助你识别应用是否正在耗费内存,也可以帮你检查应用是否正在尝试开展漫长的模块化 *** 作。
StrictMode类(注:即androidosStrictMode)与Android 23同期发布。
技巧5:在发布之前停用或最小化调试和诊断
你在Android应用的开发中可能会将某些调试代码构建其中。在应用发布之前确保这些功能被最小化或完全停用。
接下来,让我们来讨论如何用优秀的用户界面设计原则让你的应用加载速度更快。
技巧6:保持布局简洁自然
简洁自然的布局会加快加载速度。不要让屏幕布局中充斥过多不必要的内容。花点时间开发用户可以有效使用的简洁用户界面,不要将过多的功能性内容塞入单个屏幕中。这不仅对应用表现有帮助,而且会帮助用户更有效地使用应用。
分割内容可以帮助划分用户界面功能性,同时不牺牲应用在各种不同设备上的灵活性。
技巧7:根据目标设备调整应用资源
根据特定的设备配置来调整资源,这样它们就能够有效地加载。在图像资源方面,这个显得尤为重要。如果你的应用中有大型的资源需要加载,那么要做好调整。
另一个技巧是,当以许多种设备为目标时,保持应用包文件大小合适,只需要在其中包含应用运行所需的核心资源即可,然后让用户根据具体设备下载应用其他内容。
技巧8:使用Hierarchy Viewer工具
Hierarchy
Viewer工具可以帮助你解除应用布局中的漏洞。它还提供了许多有价值的信息,比如每个View控制需要多长的时间。找到问题所属领域,这样解决问题会更加简单。
技巧9:使用layoutopt工具
layoutopt工具是个简单的命令行工具,可以帮助你识别不必要的控制和其他让你布局资源崩溃的事项,提升其性能。它可以帮助你找到不必要的多余布局控制。较少和较浅布局可优化应用运行性能。
最后,在自认为应用达到最好状况时,对其进行测试。
技巧10:使用Traceview和其他Android应用压缩工具
Android SDK中有许多可以压缩应用的工具。可能最流行的工具就是Traceview,这个图像工具可以帮助你调试和找到应用的性能问题。
minSdkVersion与maxSdkVersion比较容易理解,就是在安装程序的时候,如果目标设备的API版本小于minSdkVersion,或者大于maxSdkVersion,程序将无法安装。一般来说没有必要设置maxSdkVersion。 targetSdkVersion相对复杂一些,如果设置了此属性,
每个view的坐标系原点为左上角那个点,水平方向为x轴,右正左负,竖直方向为y轴,下正上负。
canvasdrawColor //绘制区域涂上颜色(设置底色/蒙层)
canvasdrawCircle(float centerX(圆心X坐标),float centerY(圆心Y坐标),float radius(圆的半径,单位像素),Paint paint)
canvasdrawBitmap
canvasdrawRect(float left,float top,float right,float bottom,Paint paint) //画矩形
canvasdrawRect(RecF rect,Paint paint)
canvasdrawRect(Rect rect,Paint paint)
canvasdrawPoint(float x(点X轴坐标),float y(点Y轴坐标),Paint paint)//画点
点的大小 ->paintsetStrokeWidth(width)
点的形状 ->paintsetStrokeCap(cap)
ROUND(圆形),BUTT(平头),SQUARE(方头)
canvasdrawPoints()//批量画点
canvasdrawOval(float left(左边界点),float top(上边界点),float right(右边界点),float bottom(下边界点),Paint paint) //画椭圆
canvasdrawLine(float startX(起点X轴坐标),float startY(起点Y轴坐标),float stopX(终点X轴坐标),float stopY(终点X轴坐标),Paint paint) (setStyle对直线没有影响)
canvasdrawLines(批量画线)
canvasdrawRoundRect(float left,float top,float right,float bottom,float rx(圆角的横向半径),float ry(圆角的纵向坐标),Paint paint)//画圆角矩形
canvasdrawRoundRect(RectF rect,float rx, float ry,Paint paint)
canvasdrawArc(float left, float top, float right, float bottom, float startAngle(起始角度,顺时针为正,逆时针为负), float sweepAngle(弧形划过角度), boolean useCenter(是否连接到圆心), Paint paint) //绘制弧形或扇形 根据弧形所在椭圆进行绘制
canvasdrawPath() //通过描述路径的方式来绘制图形
pathaddXxx() —添加子图形
pathaddCircle(x,y,radius,dir(路径方向:顺时针/逆时针))
pathxxxTo —画线
pathlineTo()
pathrLineTo()
pathclose() —封闭当前图形
pathsetFillType(PathFillType ft) //设置填充模式
canvasdrawBitmap(Bitmap bitmap,float left,float top,Paint paint);//画bitmap
canvasdrawBitmap(Bitmap bitmap,Rect src,RectF dst,Paint paint)
canvasdrawBitmap(Bitmap bitmap,Rect src,Rect dst,Paint paint)
canvasdrawBitmap(Bitmap bitmap,Matrix matrix,Paint paint)
canvasdrawText(String text,float x(起点x坐标),float y(起点y坐标),Paint paint) //绘制文字
PaintsetStyle //设置绘制模式
FILL 填充模式(默认)
STROKE 画线模式
FILL_AND_STROKE 既画线又填充
PaintsetStrokeWidth //设置线条宽度 (仅在style:Stroke、FILL_AND_STROLE下有效)
PaintsetTextSize //设置文字大小
PaintsetAntiAlias //设置抗锯齿开关
PaintsetTextSize(float textSize)//设置文字大小
PaintsetStrokeJoin(PaintJoin join) //设置拐角的形状
MITER//尖角(默认)
BEVEL//平角
ROUND//圆角
PaintsetStokeMiter(float miter)//设置MITER型拐角的延长线的最大值
设置颜色
直接设置颜色
PaintsetColor(int color)
PaintsetARGB(int a,int r,int g,int b)
PaintsetShader(Shader shader) //设置shader
LinearGradient 线性渐变
RadialGradient 辐射渐变
SweepGradient 扫描渐变
BitmapShader 用bitmap的像素来作为图形或文字的填充
ComposeShader 混合着色器,多个shader混合使用
PaintsetColorFilter(ColorFilter colorFilter) //设置颜色过滤
PaintsetXfermode(Xfermode xfermode) //以要绘制的内容为源图像,以View中已有内容作为目标图像,选取一个PorterDuffMode作为绘制内容的颜色处理方案。
色彩优化
PaintsetDither(boolean dither) //设置抖动来优化色彩深度降低时的绘制效果
PaintsetFilterBitmap(boolean filter) //设置双线性过滤优化Bitmap放大绘制的效果
可以理解为 由马赛克变成模糊状态
PaintsetPathEffect(PathEffect effect)//使用PathEffect设置形状的轮廓效果
CornerPathEffect//把所有的拐角变成圆角
DiscretePathEffect//把线条进行随机的偏离
DashPathEffect//使用虚线
PathDashPathEffect//使用一个Path来绘制虚线
SumPathEffect//组合效果
ComposePathEffect//组合效果,组合有先后顺序
PaintsetShadowLayer(float radius,float dx,float dy,int shadowColor)//添加阴影
PaintsetMaskFilter(MaskFilter maskfilter)//在绘制层上方的附加效果
BlurMaskFilter //模糊效果
new BlurMaskFilter(float radius(模糊范围),BlurMaskFilterBlur style(模糊类型))
EmbossMaskFilter//浮雕效果
new EmbossMaskFilter(float[] direction(光源的方向),float ambient(环境光强度),float specular(炫光系数),float blurRadius(光线范围))
获取绘制的Path
getFillPath(Path src,Path dst)//实际path
getTextPath(Stirng text,int start,int end,float x,float y,Path)/getTextPath(char[] text,int index,int count,float x,float y,Path path)//文字的path
drawTextOnPath()//沿一条Path来绘制文字
StaticLayout //绘制文字,支持换行
paintsetFakeBoldText(booleab fakeBoldText)//是否使用伪粗体
paintsetStrikeThruText()//是否加删除线
paintsetUnderLineText(boolean underlineText)//是否加下划线
paintsetTextSkewX(float skewX)//设置文字横向错切角度
paintsetTextScaleX(float scaleX)//设置文字横向放缩
paintsetLetterSpacing(float letterSpacing)//设置字符间距,默认为0
paintsetTextAlign(PaintAlign align)//LEFT、CENTER、RIGHT默认为LEFT
paintsetTextLocale(Locale locale)/paintsetTextLocales(LocaleList locales) //设置绘制所用的地域
paintsetHinting(int mode)//是否启用字体微调
测量文字尺寸类:
paintgetFontSpacing();//获取推荐的行距
paintgetFontMetrics();//获取point的FontMetrics
baseline:基准线
ascent/descent:普通字符的顶部和底部范围
top/bottom:限制字型的顶部和底部
leading:行的额外间距,即上一行字的bottm与下一行字的top距离
paintgetTextBounds(String text(测量的文字),int start(文字的起始位置),int end(文字的结束位置),Rect bounds(文字显示范围的对象))//获取文字的显示范围
paintmeasureText(String text)//测量文字占用的宽度
measureText()>getTextBounds()
paintgetTextWidths(String text,float[] widths)//获取字符串中每个字符的宽度,并把结果填入参数widths
paintbreakText(String text((要测量的文字),boolean measureForwards(测量的方向),float maxWidth(宽度上限(超出上限会截断文字)),float[] measuredWidth(用于接受数据))//测量完成后会把文字宽度赋给measureWidth[0]
paintgetRunAdvance(CharSequence text,int start(文字的起始坐标),int end(文字的结束坐标),int contextStart(上下文的起始坐标),int ContextEnd(上下文的结束坐标),boolean isRtl(文字的方向),int offset(字数的偏移))//计算某个字符处光标的x坐标
paintgetOffsetForAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance)//计算出文字中最接近这个位置的字符偏移量
painthasGlyph(String s)//检查指定的字符串是否是一个单独的字型
canvasclipRect()//范围裁剪
canvasclipPath()//根据范围裁剪
canvastranslate(float dx,float dy)//位移
canvasrotate(float degrees,float px,float py)//旋转
canvasscale(float sx(横向缩放倍数),float sy(纵向缩放倍数),float px,float py)//缩放
canvasskew(float sx(x轴的错切系数),float sy(y轴的错切系数))//错切
canvassetMatrix(matrix)//用Matrix直接替换Canvas当前的变换矩阵
canvasconcat(matrix)//用Canvas当前的变换矩阵和Matrix相乘
Camerarotate()//三维旋转
1、superdraw()//总调度方法
2、superonDraw()
3、dispatchDraw()//绘制子View的方法
绘制顺序:
draw()总调度方法,view的绘制过程都发生在draw()方法里
1、背景(drawBackground()不能重写)-------android:background:/ViewsetBackgroundXxx()
2、主体(onDraw())
3、子View(dispatchDraw())
4、滑动边缘渐变和滑动条(onDrawForeground())-------android:scrollbarXxx/ViewsetXXXScrollBarXXX()
5、前景(onDrawForeground())-------android:foreground/ViewsetForeground()
viewanimate()translationX()//x轴偏移
1、如果是自定义控件,需要添加setter、getter方法
2、ObjectAnimatorofXXX()创建ObjectAnimator对象
3、用start()方法执行动画
setDuration(int duration)//设置动画时长
setInterpolator(Interpolator interpolator)//设置插值器
ViewPropertyAnimatorsetListener()/ObjectAnimatoraddListener()
ViewPropertyAnimatorsetUpdateListener()/ObjectAnimatoraddUpdateListener()
ObjectAnimatoraddPauseListener()
ViewPropertyAnimatorwithStartAction/EndAction()
ArgbEvaluator//颜色渐变动画
PropertyValuesHolder//同一个动画中改变多个属性
PropertyValuesHoldersofKeyframe()//把同一个属性拆分
AnimatorSet//多个动画配合执行
targetSdkVersion>=14,硬件加速默认开启
viewsetLayerType()
LAYER_TYPE_SOFTWARE:使用软件来绘制View Layer,绘制到Bitmap,并顺便关闭硬件加速
LAYER_TYPE_HARDWARE:使用GPU来绘制View Layer,绘制到OpenGL texture(如果硬件加速关闭,那么行为和LAYER_TYPE_SOFTWARE一致)
LAYER_TYPE_NONE:关闭View Layer
View Layer可以加速无invalidate()(例如动画)时的刷新效率,但对于需要调用invalidate()的刷新无法加速
硬件加速并不支持所有的绘制 *** 作
1、测量(measure)
View:View在onMeasuer中会计算自己的尺寸然后保存
ViewGroup:ViewGroup在onMeasure中会调用所有子View的measure让它们进行自我测量,并根据子View
计算出的期望尺寸来计算他们的事迹尺寸和位置然后保存。
2、布局(layout)
View:无子View所以onLayout不做任何处理
ViewGroup:ViewGroup在onLayout中会调用自己所有子View的layout方法,把他们的尺寸、位置传给他们, 让他们完成自我布局。
MeasureSpec = mode + size :父类传递过来给当前View的一个建议值
MeasureSpecgetMode(int spec)//获取模式
MeasureSpecgetSize(int spec)//获取数值
限制分类:
UNSPECIFIED(不限制)
AT_MOST(限制上限)->wrap_content
EXACTLY(限制固定值)->match_parent/具体值
1、重写onMeasure来修改已有的View尺寸
(1)、重写onMeasure方法,调用superonMeasure触发原有的自我测量。
(2)、在superonMeasure下用getMeasureWidth与getMeasureHeigh获取之前测量的结果,使用自己的算法计算新结果。
(3)、调用setMeasureDimension保存新结果。
2、重写onMeasure来全新定制自定义View的尺寸
与1区别,保证计算的同时,保证结果满足父View给出的尺寸限制
(1)重写onMeasure,计算出View的尺寸
(2)使用resolve让子View的计算结果符合父View的限制,也可不使用该方法自己定义
3、重写onMeasure和onLayout来全新定制自定义ViewGroup的内部布局
两个注意点:
子控件间的margin值
1、重写generateLayoutParams()和generateDefaultLayoutParams()
2、获取margin值 MarginLayoutParams lp = (MarginLayoutParams )childgetLayoutParams()
子控件间的padding值
1、测量后直接getPaddingLeft、getPaddingTop、getPaddingRight、getPaddingBottom
重写onMeasure来计算内部布局
(1)调用每个子View的measure来计算子View的尺寸
结合layout_xxx和自己可用空间
(2)计算子View的位置并保存子View的尺寸和位置
(3)计算自己的尺寸并用setMeasureDimension保存
重写onLayout来摆放子View
(1)调用每个子View的layout,让他们保存自己的位置和尺寸
view工作原理
触摸事件
1、ACTION_DOWN:手指刚接触屏幕,按下去的那一瞬间
2、ACTION_MOVE:手指在屏幕上移动
3、ACTION_UP:手指从屏幕上松开的瞬间
事件序列:从ACTION_DOWN -> ACTION_UP
ViewGroup:
DispatchTouchEvent
• return true:表示该View内部消化掉了所有事件
• return false:表示事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费
• return superdispatchTouchEvent(ev):默认事件将分发给本层的事件拦截onInterceptTouchEvent方法 进行处理
OnInterceptTouchEvent
• return true:表示将事件进行拦截,并将拦截到的事件交由本层控件的onTouchEvent进行处理
• return false:表示不对事件进行拦截,事件得以成功分发到子View
• return superonInterceptTouchEvent(ev):默认表示不拦截该事件,并将事件传递给下一层View的 dispatchTouchEvent
OnTouchEvent 默认false
• return true:表示onTouchEvent处理完事件后消费了此次事件
• return fasle:表示不响应事件,那么该事件将会不断向上层View的onTouchEvent方法传递,直到某个View的 onTouchEvent方法返回true
• return superdispatchTouchEvent(ev):表示不响应事件,结果与return false一样
子View不存在分发:
• DispatchTouchEvent 事件分发
• OnTouchEvent 默认true
如下图为事件分发流程图:
---------------------- 以上总结部分源自Hencoder教程 ------------------------------
在开发过程中,使用Filemkdirs()会返回false创建文件夹失败,有可能是权限不够的原因,需要在AndroidManifestxml中添加如下权限:
但有的权限可能会报Permission is only granted to system apps错误,导致权限申请失败,
原因是运行时权限:API 23之前的版本都是自动获取权限,而从 Android 60 开始添加了权限申请的需求,更加安全。在android60以前,我们程序需要的权限我们一般只需要在AndroidManifestxml中直接更新就好,然而Android 60在我们原有的AndroidManifestxml声明权限的基础上,又新增了运行时权限动态检测。
如果你的程序在60以上的手机报权限的问题,简单粗暴最有效的解决方法是在工程下的buildgradle中的 targetSdkVersion 改为21或22,因为Android60系统或以上默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限。
以上就是关于关于Android L最小的sdk版本是什么解决方法全部的内容,包括:关于Android L最小的sdk版本是什么解决方法、targetSdkVersion和与target属性的区别、Android自定义控件总结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)