android复合控件
Ⅰ 最新的Android控件有哪些
1.MaterialStepperView
它是用Material Design实现Steppers的。
目前,Stepper只有垂直视图,但将来会有更多的风格。你可以尝试一下,如下图:
你可以自定义normal/active两个状态的颜色,完成图标,开启动画并设置动画时长。可通过Github上的设置项和样式查阅所有设置项。该库支持API 17+,详情请查阅wiki文档。
2. MultiSnapRecyclerView
这是分屏滚动的Android库。
MultiSnapRecyclerView为RecyclerView提供了分屏功能。
目前提供的功能有:
start, end和center三个位置的吸附,
snap count 指定要分屏的数量,
支持水平和垂直分屏,
滚动时的回调。
3. Garland View for Android
该库可实现如下的布局:
GarlandView 外部是一个水平滚动的视图,视图内的每一个子视图可垂直滚动。
你可以在README中找到其他重要信息。还有一个示例App。该库支持API 19及更高版本。
4. VegaLayoutManager
这是一个自定义的布局管理器——滚动时缩小并淡出头部。这是受到Dribble项目的启发。
5. ExpandableLayout
这个库的名字不言而喻,它是一个基于LinearLayout的可扩展的布局。
README里含有你启动时需要的所有信息,另外,还有一个示例App可以帮助你快速跳转到代码中。
6. SwipeBackLayout
SwipeBackLayout允许你使用手势返回上一个界面。
你可以设置滑动方向,如从左到右、从右到左、从顶部到底部、从底部到顶部。
你还可以设置是否只能从边缘滑动。
SwipeBackLayout只能包含一个子布局,例如:
LinearLayout,RelativeLayout,FrameLayout,TableLayout等。
ScrollView,HorizontalScrollView,NestedScrollView等。
RecyclerView,AbsListView(ListView)等子类。
ViewPager,WebView等。
该项目里面有一个详细说明的文档、示例APP和一个APK。
Ⅱ android中怎样实现自定义控件中的组合控件
public
class
MyView
extends
View{
//
此处省略
构造方法
private
void
onDraw(Canvas
canvas){
//重写view的onDraw方法,绘制控件的样式
//这里你使用canvas来绘制,你布局中使用这个控件就是你绘制的样子
}
//然后你可以定义很多自己的一些方法,用来修改控件的样式
//假如你自定义的一个
进度条
的话,就要修改进度条值,你就可以自定义方法,让实现对象来改变进度值,记得修改后调用validate方法更新显示。(具体函数记不太清了)
}
大概就是这样实现的自定义控件,自定义控件的话优化是很重要的哦,不然性能会很差。
然后你要使用这个控件的话,在布局中就需要这样定义,假如这个自定义控件类是这样的:
xxx.xxx.MyView。
则使用时:
Ⅲ 如何让安卓的控件重叠在一起
安卓控件重叠主要有3中方式:
1、使用两个layout文件,然后在activity中通过addContentView的方式把两个layout都添加到布局中,实现重叠。
2、同一个layout文件中,可以通过relativelayout的方式,实现组件的重叠。相关属性有
相对于父元素完全居中
android:layout_alignParentBottom
贴紧父元素的下边缘
android:layout_alignParentLeft
贴紧父元素的左边缘
android:layout_alignParentRight
贴紧父元素的右边缘
android:layout_alignParentTop
贴紧父元素的上边缘
android:layout_alignWithParentIfMissing
3、同一个layout文件中,通过FrameLayout的方式,这是最简单的,本身不做任何调整和设置,放置2个控件就是重叠的。
题目解决:
对于题目中,可以使用已经封装好的第三方包BadgeView(原理就上面第2中方式),
Ⅳ android布局控件之LinearLayout详解
Android布局控件之LinearLayout详解
LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的containers,超过边界时,某些控件将缺失或消失。因此一个垂直列表的每一行只会有一个widget或者是container,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子控件的高度加上边框高度)。LinearLayout保持其所包含的widget或者是container之间的间隔以及互相对齐(相对一个控件的右对齐、中间对齐或者左对齐)。
xml属性
android:baselineAligned:是否允许用户调整它内容的基线。
android:baselineAlignedChildIndex:当一个线性布局与另一个布局是按基线对齐的一部分,它可以指定其内容的基线对齐方式。
android:gravity:指定如何在该对象中放置此对象的内容(x/y坐标值)。
android:orientation:设置它内容的对其方向(横向/竖向)。
gravity 这个英文单词是重心的意思,在这里就表示停靠位置的意思。
android:layout_gravity 和 android:gravity 的区别
从名字上可以看到,android:gravity是对元素本身说的,元素本身的文本显示在什么地方靠着换个属性设置,不过不设置默认是在左侧的。
android:layout_gravity是相对与它的父元素说的,说明元素显示在父元素的什么位置。
比如说button:android:layout_gravity 表示按钮在界面上的位置。 android:gravity表示button上的字在button上的位置。
可选值
这两个属性可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical。
而且这些属性是可以多选的,用“|”分开。
默认这个的值是:Gravity.LEFT
LinearLayout还支持为其包含的widget或者是container指定填充权值。好处就是允许其包含的widget或者是container可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串widgets或者是containers挤成一堆的情况,而是允许他们放大填充空白。剩余的空间会按这些widgets或者是containers指定的权值比例分配屏幕。默认的 weight 值为0,表示按照widgets或者是containers实际大小来显示,若高于0的值,则将Container剩余可用空间分割,分割大小具体取决于每一个widget或者是container的layout_weight及该权值在所有widgets或者是containers中的比例。例如,如果有三个文本框,其中两个指定的权值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框不会放大,按实际大小来显示。如果前两个文本框的取值一个为2,一个为1,显示第三个文本框后剩余的空间的2/3给权值为2的,1/3大小给权值为1的。也就是权值越大,重要度越大。
如果LinearLayout包含子LinearLayout,子LinearLayout之间的权值越大的,重要度则越小。如果有LinearLayout A包含LinearLayout C,D,C的权值为2,D的权值为1,则屏幕的2/3空间分给权值为1的D,1/3分给权值为2的C。在LinearLayout嵌套的情况下,子LinearLayout必须要设置权值,否则默认的情况是未设置权值的子LinearLayout占据整个屏幕
Ⅳ Android两个控件叠在一起,如何让被挡住的控件显示出来
设置属性gone或者invisible前者不占位置后者占位置
Ⅵ 如何让安卓的控件重叠在一起
相对布局,两个组件放到一个相对布局中,然后布局自适应大小,关闭放在父类布局的右上角
Ⅶ android 有哪些常用控件
如果你是刚开始学1到两个月的,你记住以下几个控件也就是安卓中最常用的控件,你到哪里都有:Button ,TextView,EditText,ListView,这几个是最常见的,以后你这几个学好了,其它就没有问题了,后来你还要开发自定义控件,那就要把这几个学好了。
Ⅷ Android自定义控件总结
每个view的坐标系原点为左上角那个点,水平方向为x轴,右正左负,竖直方向为y轴,下正上负。
canvas.drawColor //绘制区域涂上颜色(设置底色/蒙层)
canvas.drawCircle(float centerX(圆心X坐标),float centerY(圆心Y坐标),float radius(圆的半径,单位像素),Paint paint)
canvas.drawBitmap
canvas.drawRect(float left,float top,float right,float bottom,Paint paint) //画矩形
canvas.drawRect(RecF rect,Paint paint)
canvas.drawRect(Rect rect,Paint paint)
canvas.drawPoint(float x(点X轴坐标),float y(点Y轴坐标),Paint paint)//画点
点的大小 ->paint.setStrokeWidth(width)
点的形状 ->paint.setStrokeCap(cap)
ROUND(圆形),BUTT(平头),SQUARE(方头)
canvas.drawPoints()//批量画点
canvas.drawOval(float left(左边界点),float top(上边界点),float right(右边界点),float bottom(下边界点),Paint paint) //画椭圆
canvas.drawLine(float startX(起点X轴坐标),float startY(起点Y轴坐标),float stopX(终点X轴坐标),float stopY(终点X轴坐标),Paint paint) (setStyle对直线没有影响)
canvas.drawLines(批量画线)
canvas.drawRoundRect(float left,float top,float right,float bottom,float rx(圆角的横向半径),float ry(圆角的纵向坐标),Paint paint)//画圆角矩形
canvas.drawRoundRect(RectF rect,float rx, float ry,Paint paint)
canvas.drawArc(float left, float top, float right, float bottom, float startAngle(起始角度,顺时针为正,逆时针为负), float sweepAngle(弧形划过角度), boolean useCenter(是否连接到圆心), Paint paint) //绘制弧形或扇形 根据弧形所在椭圆进行绘制
canvas.drawPath() //通过描述路径的方式来绘制图形
path.addXxx() —添加子图形
path.addCircle(x,y,radius,dir(路径方向:顺时针/逆时针))
path.xxxTo —画线
path.lineTo()
path.rLineTo()
path.close() —封闭当前图形
path.setFillType(Path.FillType ft) //设置填充模式
canvas.drawBitmap(Bitmap bitmap,float left,float top,Paint paint);//画bitmap
canvas.drawBitmap(Bitmap bitmap,Rect src,RectF dst,Paint paint)
canvas.drawBitmap(Bitmap bitmap,Rect src,Rect dst,Paint paint)
canvas.drawBitmap(Bitmap bitmap,Matrix matrix,Paint paint)
canvas.drawText(String text,float x(起点x坐标),float y(起点y坐标),Paint paint) //绘制文字
Paint.setStyle //设置绘制模式
FILL 填充模式(默认)
STROKE 画线模式
FILL_AND_STROKE 既画线又填充
Paint.setStrokeWidth //设置线条宽度 (仅在style:Stroke、FILL_AND_STROLE下有效)
Paint.setTextSize //设置文字大小
Paint.setAntiAlias //设置抗锯齿开关
Paint.setTextSize(float textSize)//设置文字大小
Paint.setStrokeJoin(Paint.Join join) //设置拐角的形状
MITER//尖角(默认)
BEVEL//平角
ROUND//圆角
Paint.setStokeMiter(float miter)//设置MITER型拐角的延长线的最大值
设置颜色
直接设置颜色
Paint.setColor(int color)
Paint.setARGB(int a,int r,int g,int b)
Paint.setShader(Shader shader) //设置shader
LinearGradient 线性渐变
RadialGradient 辐射渐变
SweepGradient 扫描渐变
BitmapShader 用bitmap的像素来作为图形或文字的填充
ComposeShader 混合着色器,多个shader混合使用
Paint.setColorFilter(ColorFilter colorFilter) //设置颜色过滤
Paint.setXfermode(Xfermode xfermode) //以要绘制的内容为源图像,以View中已有内容作为目标图像,选取一个PorterDuff.Mode作为绘制内容的颜色处理方案。
色彩优化
Paint.setDither(boolean dither) //设置抖动来优化色彩深度降低时的绘制效果
Paint.setFilterBitmap(boolean filter) //设置双线性过滤优化Bitmap放大绘制的效果
可以理解为 由马赛克变成模糊状态
Paint.setPathEffect(PathEffect effect)//使用PathEffect设置形状的轮廓效果
CornerPathEffect//把所有的拐角变成圆角
DiscretePathEffect//把线条进行随机的偏离
DashPathEffect//使用虚线
PathDashPathEffect//使用一个Path来绘制虚线
SumPathEffect//组合效果
ComposePathEffect//组合效果,组合有先后顺序
Paint.setShadowLayer(float radius,float dx,float dy,int shadowColor)//添加阴影
Paint.setMaskFilter(MaskFilter maskfilter)//在绘制层上方的附加效果
BlurMaskFilter //模糊效果
new BlurMaskFilter(float radius(模糊范围),BlurMaskFilter.Blur 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 //绘制文字,支持换行
paint.setFakeBoldText(booleab fakeBoldText)//是否使用伪粗体
paint.setStrikeThruText()//是否加删除线
paint.setUnderLineText(boolean underlineText)//是否加下划线
paint.setTextSkewX(float skewX)//设置文字横向错切角度
paint.setTextScaleX(float scaleX)//设置文字横向放缩
paint.setLetterSpacing(float letterSpacing)//设置字符间距,默认为0
paint.setTextAlign(Paint.Align align)//LEFT、CENTER、RIGHT默认为LEFT
paint.setTextLocale(Locale locale)/paint.setTextLocales(LocaleList locales) //设置绘制所用的地域
paint.setHinting(int mode)//是否启用字体微调
测量文字尺寸类:
paint.getFontSpacing();//获取推荐的行距
paint.getFontMetrics();//获取point的FontMetrics
baseline:基准线
ascent/descent:普通字符的顶部和底部范围
top/bottom:限制字型的顶部和底部
leading:行的额外间距,即上一行字的bottm与下一行字的top距离
paint.getTextBounds(String text(测量的文字),int start(文字的起始位置),int end(文字的结束位置),Rect bounds(文字显示范围的对象))//获取文字的显示范围
paint.measureText(String text)//测量文字占用的宽度
measureText()>getTextBounds()
paint.getTextWidths(String text,float[] widths)//获取字符串中每个字符的宽度,并把结果填入参数widths
paint.breakText(String text((要测量的文字),boolean measureForwards(测量的方向),float maxWidth(宽度上限(超出上限会截断文字)),float[] measuredWidth(用于接受数据))//测量完成后会把文字宽度赋给measureWidth[0]
paint.getRunAdvance(CharSequence text,int start(文字的起始坐标),int end(文字的结束坐标),int contextStart(上下文的起始坐标),int ContextEnd(上下文的结束坐标),boolean isRtl(文字的方向),int offset(字数的偏移))//计算某个字符处光标的x坐标
paint.getOffsetForAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance)//计算出文字中最接近这个位置的字符偏移量
paint.hasGlyph(String s)//检查指定的字符串是否是一个单独的字型
canvas.clipRect()//范围裁剪
canvas.clipPath()//根据范围裁剪
canvas.translate(float dx,float dy)//位移
canvas.rotate(float degrees,float px,float py)//旋转
canvas.scale(float sx(横向缩放倍数),float sy(纵向缩放倍数),float px,float py)//缩放
canvas.skew(float sx(x轴的错切系数),float sy(y轴的错切系数))//错切
canvas.setMatrix(matrix)//用Matrix直接替换Canvas当前的变换矩阵
canvas.concat(matrix)//用Canvas当前的变换矩阵和Matrix相乘
Camera.rotate*()//三维旋转
1、super.draw()//总调度方法
2、super.onDraw()
3、dispatchDraw()//绘制子View的方法
绘制顺序:
draw()总调度方法,view的绘制过程都发生在draw()方法里
1、背景(drawBackground()不能重写)-------android:background:/View.setBackgroundXxx()
2、主体(onDraw())
3、子View(dispatchDraw())
4、滑动边缘渐变和滑动条(onDrawForeground())-------android:scrollbarXxx/View.setXXXScrollBarXXX()
5、前景(onDrawForeground())-------android:foreground/View.setForeground()
view.animate().translationX()//x轴偏移
1、如果是自定义控件,需要添加setter、getter方法
2、ObjectAnimator.ofXXX()创建ObjectAnimator对象
3、用start()方法执行动画
setDuration(int ration)//设置动画时长
setInterpolator(Interpolator interpolator)//设置插值器
ViewPropertyAnimator.setListener()/ObjectAnimator.addListener()
ViewPropertyAnimator.setUpdateListener()/ObjectAnimator.addUpdateListener()
ObjectAnimator.addPauseListener()
ViewPropertyAnimator.withStartAction/EndAction()
ArgbEvaluator//颜色渐变动画
PropertyValuesHolder//同一个动画中改变多个属性
PropertyValuesHolders.ofKeyframe()//把同一个属性拆分
AnimatorSet//多个动画配合执行
targetSdkVersion>=14,硬件加速默认开启
view.setLayerType()
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的一个建议值
MeasureSpec.getMode(int spec)//获取模式
MeasureSpec.getSize(int spec)//获取数值
限制分类:
UNSPECIFIED(不限制)
AT_MOST(限制上限)->wrap_content
EXACTLY(限制固定值)->match_parent/具体值
1、重写onMeasure来修改已有的View尺寸
(1)、重写onMeasure方法,调用super.onMeasure触发原有的自我测量。
(2)、在super.onMeasure下用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 )child.getLayoutParams()
子控件间的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 super.dispatchTouchEvent(ev):默认事件将分发给本层的事件拦截onInterceptTouchEvent方法 进行处理
OnInterceptTouchEvent
• return true:表示将事件进行拦截,并将拦截到的事件交由本层控件的onTouchEvent进行处理
• return false:表示不对事件进行拦截,事件得以成功分发到子View
• return super.onInterceptTouchEvent(ev):默认表示不拦截该事件,并将事件传递给下一层View的 dispatchTouchEvent
OnTouchEvent 默认false
• return true:表示onTouchEvent处理完事件后消费了此次事件
• return fasle:表示不响应事件,那么该事件将会不断向上层View的onTouchEvent方法传递,直到某个View的 onTouchEvent方法返回true
• return super.dispatchTouchEvent(ev):表示不响应事件,结果与return false一样
子View不存在分发:
• DispatchTouchEvent 事件分发
• OnTouchEvent 默认true
如下图为事件分发流程图:
---------------------- 以上总结部分源自Hencoder教程 ------------------------------
Ⅸ android列表常用控件有哪些
一、概述 Android中的有个原生的下拉列表控件Spinner,但是这个控件有时候不符合我们自己的要求, 比如有时候我们需要类似windows 或者web网页中常见的那种下拉列表控件,类似下图这样的: 这个时候只有自己动手写一个了。其实实现起来不算很难, 本文实现的方案是采用TextView +ImageView+PopupWindow的组合方案。 先来看看我们的自己写的控件效果图吧:(源码在文章下面最后给出哈!) 二、自定义下拉列表框控件的实现 1. 自定义控件用到的布局文件和资源: 结果框的布局页面:dropdownlist_view.xml: <?xml version="1.0" encoding="utf-8"?>