編輯:關於Android編程
閒得蛋疼,折騰折騰android源碼包下面widget包下面很少用以及幾乎沒聽說過的控件(針對自己而言,莫要批斗(⊙o⊙)哦丫)。
TextClock繼承自TextView,擴展自定義屬性三個(主要是顯示格式相關屬性控制)
在onAttachedToWindow和onDetachedFromWindow方法注冊了廣播和取消注冊,監聽時間發生變化了,接收到廣播,調用onTimeChanged方法更新UI,下面是簡要代碼塊
@Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (!mAttached) { mAttached = true; registerReceiver(); // .................略.................... } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mAttached) { unregisterReceiver(); // .................略.................... } } private void registerReceiver() { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_TICK); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); getContext().registerReceiver(mIntentReceiver, filter, null, getHandler()); } private void unregisterReceiver() { getContext().unregisterReceiver(mIntentReceiver); } private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (mTimeZone == null && Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) { final String timeZone = intent.getStringExtra("time-zone"); createTime(timeZone); } onTimeChanged(); } }; private void onTimeChanged() { mTime.setTimeInMillis(System.currentTimeMillis()); setText(DateFormat.format(mFormat, mTime)); setContentDescription(DateFormat.format(mDescFormat, mTime)); }
Space控件繼承自View,在構造函數直接把控件設置為INVISIBLE模式,修改測量方法onMeasure,取消了draw方法的canvas繪制渲染的處理,下面是測量寬高相關核心代碼
private static int getDefaultSize2(int size, int measureSpec) { int result = size; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); switch (specMode) { case MeasureSpec.UNSPECIFIED: result = size; break; case MeasureSpec.AT_MOST: result = Math.min(size, specSize); break; case MeasureSpec.EXACTLY: result = specSize; break; } return result; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension( getDefaultSize2(getSuggestedMinimumWidth(), widthMeasureSpec), getDefaultSize2(getSuggestedMinimumHeight(), heightMeasureSpec)); }
如果在以前你喜歡用View控件,setVisiblity占用屏幕空間,建議以後替換成Space控件,好處在於draw方法的重寫,具體不解釋。
ZoomButton內部就一個核心點,設置ZoomSpeed,默認速度值1000,ZoomControl是一個自定義的ViewGroup,布局控件默認inflater預先定義好的布局,如下
如果你想改變著丑陋的UI,你可以嘗試拷貝源碼出來,修改Inflater的布局即可。這個空間提供的show 、hide方法只是在執行透明動畫,關鍵代碼塊如下
public void show() { fade(View.VISIBLE, 0.0f, 1.0f); } public void hide() { fade(View.GONE, 1.0f, 0.0f); } private void fade(int visibility, float startAlpha, float endAlpha) { AlphaAnimation anim = new AlphaAnimation(startAlpha, endAlpha); anim.setDuration(500); startAnimation(anim); setVisibility(visibility); }
該類對ZoomSpeed值提供了一個方法setZoomSpeed設置,其他的沒什麼好關注的,Listener的監聽回調也略過吧,就這樣吧。(merge沒用過的可以去了解一下)
AdapterViewFlipper可以實現輪播圖片,雖然有點撇腳,不能手動滑動,也無法感知輪播到了那個界面,關於這一點可以重寫控件,修改showNext回調位置,至於手動滑動需要手勢攔截處理這塊怎麼說呢,你若有興趣自己造輪子可以試試。
這裡要區別兩個類:ViewFlipper和AdapterViewFlipper,這是兩個不同的類,下面是他們的繼承體系
AdapterViewFlipper的自定義屬性在他的父類有定義自己也有定義,下面來看看具體的含義與代碼調用方法
下面是對照自定義屬性的說明和方法調用
當你使用默認播放動畫切換視圖感覺不是1秒,不要覺得奇怪,動畫執行也需要時間的,默認in 、out 動畫時常都是200。對於代碼功能性調用來說我們只需要關注下面這幾個方法即可
startFlipping開啟輪播沒啥好說的,該類同樣使用了上面提到的注冊廣播,注冊了屏幕關閉和喚醒廣播,關閉屏幕就暫停輪播,喚醒時如果之前是輪播狀態,那麼繼續開始輪播。(相關代碼塊就不貼,自己查看源代碼)
StackView雖說也是AdapterViewAnimator子類,但是其實現效果與AdapterViewFlipper不同,具體效果圖就不貼了,實在是原生控件在實際得出的效果拿不出手,而且感覺在應用場景上來說也找不到對應的,於是乎在github檢索了一會,找到了一個還算不錯的開源,下面是地址和效果圖:https://github.com/blipinsk/FlippableStackView
這個ImageView的擴展可以簡單的了解一下,推薦農民伯伯大神博客地址:http://www.cnblogs.com/over140/archive/2010/09/28/1837287.html,開發中用的比較少,大概看看就行了
ViewFlipper、ViewSwitcher都是繼承自ViewAnimator,ViewFlipper與AdapterViewFlipper差別不大略過,這裡主要是關注一下ViewSwitcher相關類擴展一下視野。ViewAnimator是繼承自FrameLayout,而ViewSwitcher是其子類,強制有且只能有2個childView,TextSwitcher限定childView必須是TextView.關於這類擴展控件自行檢索Github.
直接貼代碼估計比較晦澀難懂了,能把人給繞暈了,我們還是先看圖說話吧。
他們之間的的關系到底有多深呢,且聽我一一道來。最上層ViewGrou抽象下來的Adapter,擁有很多子類,Spinner的具體實現,跟蹤源代碼發現內部有實例化出一個ListPopuWindow、DialogPopup(根據不同的mode選擇不同的實例,本質區別一個是popuwindow一個是AlertDialog),而ListPZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcHVXaW5kb3fA4MjDztK3os/WwcvV4sO0uPa2q873RHJvcERvd25MaXN0VmlldyC1xMq1wP2jqEFsZXJ0RGlhbG9nzazR+bX308PBy2dldExpdFZpZXe3vbeoo6k8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> private static class DropDownListView extends ListView { }
由此可以知道每個ListPopuWindow裡面有一個LIstView,Spinner彈出來的其實就是ListView綁定適配器,而Spinner內部定義了一個DropDownAdapter,ListView綁定Adapter,最後調用各自mode對應的popu.show就可以了。那麼問題來了,Spinner在很麼時候彈出ListPopuWindow?帶著這個問題繼續跟蹤Spinner源碼
ViewGroup繼承自View,所以可以共享父類方法performClick,點擊時會調用該方法,自然Spinner也不例外,具體調用代碼塊如下(當然還有其他地方有觸發,這裡暫不深入理解了)
@Override public boolean performClick() { boolean handled = super.performClick(); if (!handled) { handled = true; if (!mPopup.isShowing()) { mPopup.show(getTextDirection(), getTextAlignment()); } } return handled; }
用過的人都知道Spinner的Item預定義樣式有點丑陋,主要是AbsSpinner搞鬼,下面是預定義的載入代碼塊(修改Spinner樣式可以參考adapter這裡的調用)
public AbsSpinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); initAbsSpinner(); final TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.AbsSpinner, defStyleAttr, defStyleRes); final CharSequence[] entries = a.getTextArray(R.styleable.AbsSpinner_entries); if (entries != null) { final ArrayAdapteradapter = new ArrayAdapter ( context, R.layout.simple_spinner_item, entries); adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item); setAdapter(adapter); } a.recycle(); }
看完Spinner有了個大概的認知,再看AutoCompleteTextView(他的子類同理略過了),內部同樣實例了ListPopuWindow,添加了一個EditText輸入內容的監聽
addTextChangedListener(new MyWatcher());
如果你對這個方法不陌生應該秒懂了吧,根據輸入內容,當輸入內容有變化立即執行過濾匹配適配器,這裡過濾具體實現暫不涉及。
在之前我寫過一篇關於ListView的單選和多選相關的分析的博客http://blog.csdn.net/analyzesystem/article/details/51319841,裡面有提到一個非常重要的接口Checkable,這裡就不多說廢話了,同時提供一個開源庫關於CheckedTextView相關的擴展庫(別太當真,看看就好,擴展視野)
https://github.com/akbarsha03/Custom_CheckedTextView
這是一個擴展子TextView的計時器控件,然而我不得不吐槽,官方提供的很多原生控件都不咋樣,與開源項目同類型的開源控件沒法比
收獲了兩點:
1.在onAttachedToWindow和onDetachedFromWindow方法注冊廣播和取消注冊,接收到廣播,來做一些回調或者更新UI
2.了解了Spinner AutoCompleteTextView ListView等相關類的相關實現。
本文實例講述了Android編程實現canvas繪制柱狀統計圖功能。分享給大家供大家參考,具體如下:這裡實現了一個簡單的柱狀統計圖,如下: 特點:1.根據數據源
1、Service的種類 按運行地點分類: 類別區別 優點缺點 應用本地服務(Local)該服務依附在主進程上, 服務依附在主進
酷狗音樂最新版有ktv模式啦,大家想k歌的話不用去ktv也可以自已在家k歌,愛唱歌的朋友一起來學習下酷狗音樂怎麼k歌吧! 1.首先,打開酷狗這個軟件,建議
Android聯系人中的ListView是做得比較獨特的,但是源碼寫得比較復制,當我們想使用他的時候再從源碼中提取,實屬不易啊,而且容易出錯,這幾天,我把他提取出來了,寫