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"?>