Android帶你實現門票佈局效果
今天帶給大家一個門票佈局的效果。直接看圖吧:
上圖展示了一個門票列表的介面,可以發現每個Item的四個角都是凹下去的。並且圖片左邊上下兩個角也是凹下去的。我們該如何實現這種效果呢?
有朋友可能會說UI肯定會給一個這樣的背景圖片的。嗯,使用這樣的圖片肯定沒問題,缺點就是加在多了佔據記憶體而已。可是Photo的左上和左下也是要這樣的圓角哇。該怎麼辦呢?
基於這種需求,我們可以變換一種方式來實現。讓UI給我們每個角的半徑,我們自己來畫出來就OK了。
我們今天要實現的效果是不使用任何圖片,完全自定義佈局和圖片來實現這樣的效果。
實現思路:
(1)自定義一個佈局,繼承自LinearLayout,使用Paint根據半徑在四個角畫四個圓,背景為白色。
(2)自定義圖片控制元件,繼承自ImageView,同樣使用Paint根據半徑在左上角和左下角畫圓,背景為白色。
思路很清楚,就是利用了畫圓的效果在視覺上給人一種凹角的感覺。下面看核心程式碼:
自定義LinearLayout:
/** * View的大小發生改變時並且在onFinishInflate方法後被回撥 * @param w * @param h * @param oldw * @param oldh */ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); //獲取佈局的寬高 this.layoutWidth = w; this.layoutHeight = h; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(0,0,radius,paint); canvas.drawCircle(0,layoutHeight,radius,paint); canvas.drawCircle(layoutWidth,0,radius,paint); canvas.drawCircle(layoutWidth,layoutHeight,radius,paint); }自定義IamegView:
/** * View的大小發生改變時並且在onFinishInflate方法後被回撥 * @param w * @param h * @param oldw * @param oldh */ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); //獲取佈局的寬高 this.layoutWidth = w; this.layoutHeight = h; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(0,0,radius,paint); canvas.drawCircle(0, layoutHeight, radius, paint); }
圓的半徑我們通過自定義屬性來實現:
<declare-styleable name="TLayout"> <attr name="radius" format="dimension" /> </declare-styleable>
然後在建構函式中獲取即可:
public TLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.TLayout,defStyleAttr,0); int num = ta.getIndexCount(); for (int i = 0; i < num; i++) { int attr = ta.getIndex(i); switch (attr) { case R.styleable.TLayout_radius: radius = ta.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,5,getResources().getDisplayMetrics())); break; default: break; } } ta.recycle(); initPaint(); }上面程式碼使用了for迴圈的方式來獲取自定義的屬性值,這種方式適合屬性多的場景,如果自定義屬性值比較少,那麼可以使用下面這個方法來獲取:
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TLayout, defStyleAttr, 0); radius = ta.getDimensionPixelSize(R.styleable.TLayout_radius, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,5,getResources().getDisplayMetrics())); ta.recycle();
ok,來看下效果圖:
好啦,今天的介紹就到這裡啦,有問題的朋友給我留言。
相關文章
- Android自定義View實現流式佈局(熱門標籤效果)AndroidView
- [譯] 帶你入門 CSS Grid 佈局CSS
- 網頁佈局------輪播圖效果實現網頁
- 【佈局進階】巧用 :has & drop-shadow 實現複雜佈局效果
- 仿天貓App實現商品列表佈局切換效果APP
- Android實現RecyclerView巢狀流式佈局AndroidView巢狀
- 強大的CSS:實現平行四邊形佈局效果CSS
- css模擬實現手機通訊錄佈局效果CSS
- Android入門教程 | UI佈局之RelativeLayout 相對佈局AndroidUI
- android 入門xml佈局檔案AndroidXML
- 佈局總結-水平居中佈局的實現
- Android入門教程 | UI佈局之LinearLayout 線性佈局AndroidUI
- css3的flex實現的響應式佈局效果CSSS3Flex
- Android 實現一個通用的圓角佈局Android
- 關於Android中xml佈局檔案之android 入門xml佈局檔案AndroidXML
- 聖盃佈局進階版-flex佈局實現Flex
- 你需要的Grid佈局入門教程
- CSS佈局–聖盃佈局和雙飛翼佈局以及使用Flex實現聖盃佈局CSSFlex
- flex彈性佈局實現元素垂直居中效果程式碼例項Flex
- Android 佈局Android
- android 實現FlowLayout 流線佈局(自定義ViewGroup)AndroidView
- Android FoldingLayout 摺疊佈局 原理及實現(一)Android
- Android 動態佈局實現多主題切換Android
- CSS多種佈局方式自我實現-水平佈局(二)CSS
- jQuery實現瀑布流佈局jQuery
- Grid 拖拽佈局實現
- css3帶你實現3D轉換效果CSSS33D
- css佈局-實現左中右佈局的5種方式CSS
- 使用 CSS columns 佈局來實現自動分組佈局CSS
- 你需要知道的Android View的佈局AndroidView
- React無門檻實現拖拽佈局、表單設計器React
- Android Layout 之 RelativeLayout,程式碼實現相對佈局Android
- 面試官問:你有多少種方式實現三欄佈局?面試
- css 佈局入門CSS
- CSS佈局入門CSS
- Android佈局概述Android
- Android xml 佈局AndroidXML
- div 實現田字格佈局