常用UI細節(jié)

  • Android Support v4:為兼顧1.6及以上的包

    ViewPager官硝、FragmentActivity
    
  • Android Support v7:為兼顧2.1及以上的包吐根,v7依賴v4包

    ActionBarActivity璧微、ViewDragHelper咪鲜、DrawerLayout
    
  • Android Support v13:為兼顧2.1及以上的包,一般是為了平板開發(fā)

TextView

  • <selector/>正常顏色要放在最后面
  • 通過drawable減少層級

Bitmap&Factory

  • 在Android 2.3.3(API Level 10)以及之前扛门,Bitmap的backing pixel 數(shù)據(jù)存儲在native memory, 與Bitmap本身是分開的烦衣,Bitmap本身存儲在dalvik heap 中。導致其pixel數(shù)據(jù)不能判斷是否還需要使用勤众,不能及時釋放舆绎,容易引起OOM錯誤。 從Android 3.0(API 11)開始们颜,pixel數(shù)據(jù)與Bitmap一起存儲在Dalvik heap中吕朵。

  • 圖片寬高

    BitmapFactory.decode(BitmapFactory.Option)  // 使用參數(shù)解析圖片以減少內(nèi)存占用
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true; 
    // 第一次解析,只為獲取options.outWidth/outHeight的值
    bitmap = BitmapFactory.decodeFile(path, options);
    // 通過解析的寬窥突、高計算合適的取樣大小
    if (sampleSize <= 0){sampleSize = 2;}   // 解析時壓縮(2的次方更快):1400*1400變?yōu)?00*700
    options.inPreferredConfig=Bitmap.Config.ARGB_4444;
    options.inJustDecodeBounds=false;
    // 第二次解析努溃,獲取真正的bitmap
    bitmap = BitmapFactory.decodeFile(path, options);
    
  • 根據(jù)分辨率適配后的顯示寬高(可以在onCreate的時候就獲取到)

    BitmapDrawable drawable = (BitmapDrawable) res.getDrawable(R.drawable.xx);
    int arrowHeight = drawable.getIntrinsicHeight();
    int arrowWidth = drawable.getIntrinsicWidth();
    
  • Bitmap內(nèi)存大小 = 寬度px * 高度px * 位深度所占大小

    Bitmap.Config.ARGB_8888:每個A、R阻问、G梧税、B通道分別占4byte(8位256種顏色)
    如700 * 700的圖片占用(700*700*4)/1024/1024=1.87M
    
  • 獲取View快照

    view.destroyDrawingCache();
    view.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
    view.setDrawingCacheEnabled(false);
    

ImageView

  • ImageView的設(shè)置內(nèi)容方法最終會生成一個mBitmapDrawable對象,其內(nèi)部持有真正的Bitmap對象称近;注意mUri/mResource將在主線程解析bitmap第队,因此可能會引起阻塞

    setImageURI()
    setImageResource()
    setImageBitmap()
    setImageDrawable()
    
  • 回收

    protected void recycleImageView(ImageView imageView) {
        if (imageView != null) {
            Drawable drawable = imageView.getDrawable();
            imageView.setImageDrawable(null); // 先切斷關(guān)聯(lián)
            if (drawable != null) { // 獲取圖片
                Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
                if (bitmap != null && !bitmap.isRecycled()) {
                    bitmap.recycle();
                }
            }
        }
    }
    
  • Bitmap加載出來的大小(包括內(nèi)存占用大信俑选)和ImageView顯示的大小沒有必然關(guān)系:顯示的小未必占用內(nèi)存械是;且這兩個不同大小的矩形矩形重疊在一起顯示衡未,需要不同的縮放策略

    private void initImageView() {
        mMatrix     = new Matrix();
        mScaleType  = ScaleType.FIT_CENTER;
    }
    
    ScaleType.MATRIX,       // Matrix
    ScaleType.FIT_XY,       // Matrix.ScaleToFit.FILL
    ScaleType.FIT_START,    // Matrix.ScaleToFit.START
    ScaleType.FIT_CENTER,   // Matrix.ScaleToFit.CENTER
    ScaleType.FIT_END,      // Matrix.ScaleToFit.END
    ScaleType.CENTER,       // 底圖bitmap不進行縮放尸执,按原圖居中顯示,只是在draw bitmap之前將畫布移動到左上角缓醋,對齊圓點而已
    ScaleType.CENTER_CROP,  // 把bitmap縮放后平移至居中剔交;依照view的大邊縮放(縮放比例較小)
    ScaleType.CENTER_INSIDE
    

ListView

  • AdapterView中的addView()改衩、removeAllView()都是不能使用的(拋異常)來保證所有的視圖操作都是通過adapter來操作的

  • 設(shè)置底色為透明岖常,優(yōu)化性能

    android:background="@android:color/transparent"
    android:cacheColorHint="@android:color/transparent"
    android:listSelector="@android:color/transparent"
    
  • setEmptyView(); 需要empty view在當前布局中,可以結(jié)合ViewStub

  • item高度最好使用確定值葫督,因為ListView需要根據(jù)累計高度和總高度比較判斷是否再調(diào)用getView()

  • android:duplicateParentState="true"
    父控件響應點擊事件竭鞍,子View不響應點擊事件,但是顏色要隨著點擊而發(fā)生變化

  • 多類別重寫getItemTypeCount(); 決定了getView()緩存幾個converView

  • listview是循環(huán)滑動的,所以沒有所謂的scrollY掰茶,但可以通過監(jiān)聽計算得到

    mListView.setOnScrollListener(new OnScrollListener(){});
    
  • pointToPosition(downX,downY)根據(jù)傳入的XY判斷點擊的是哪個條目

    int clickPosition = pointToPosition(downX, downY);
    // 獲取我們點擊的item view
    View itemView = getChildAt(clickPosition -  getFirstVisiblePosition());
    
  • 復用getView()參數(shù)中的convertView株茶;使用ViewHolder減少findViewById次數(shù)

  • addHeadView

    1. addHeaderView(headView, null, false),false用來設(shè)置header是否可以被選擇晒夹;可以多次調(diào)用,添加的View按照調(diào)用的順序
    2. API19之前addHeaderView()必須放在listview.setadapter()前面調(diào)用,API19之后可以隨處調(diào)用丐怯。實質(zhì)是對Adapter包裝為HeaderViewListAdapter
    3. HeadView的點擊事件在onItemClick中處理[?]

ViewPager

startUpdate()
destroyItem()           // 先刪除一個廢棄的
instantiateItem()       // 創(chuàng)建一個即將使用的
setPrimaryItem()        // 多次調(diào)用喷好,可以用來保存當前對象
finishUpdate()          // 多次調(diào)用
saveState()
restoreState()
  • ViewPager在切換的時候回重新定位焦點,導致重新布局[?]

Fragment

  1. FragmentActivity防止重復創(chuàng)建

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        MyFragment myFragment;
        if (savedInstanceState == null) {
            myFragment = MyFragment.newInstance();
            // add fragment
        }
        
        // 或者
        MyFragment myFragment = getSupportFragmentManager().findFragmentById(R.id.contentFrame);
        if (myFragment == null) {
            myFragment = MyFragment.newInstance();
            // add fragment
        }
    }
    
  2. Fragment聲明周期

    public class MyFragment extends BaseFragment {
        
        private Persenter mPersenter;
        private Listener mListener;
        
        public MyFragment() {
            setRetainInstance(true);
        }
        
        public static MyFragment newInstance() {
            return new MyFragment();
        }
        
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            if (activity instanceof Listener) {
                mListener = (Listener) activity;
            }
        }
        
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
        
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.xxx, container, false);
            initView(); // ButterKnife.inject(this, view);
            return rootView;
        }
        
        public void onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            if (savedInstanceState == null) {
                this.loadUserDetails();
            }
        }
        
        public void onDestroyView() {
            super.onDestroyView();
            listview.setAdapter(null);
            ButterKnife.reset(this);
        }
        
        public void onDestroy() {
            super.onDestroy();
            this.mPresenter.destroy();  // view = null; unsubscribe();
        }
        
        public void onDetach() {
            super.onDetach();
            mPersenter = null;
        }
    }
    

android:configChanges="orientation|screenSize"

  • 如果不配置ActivityFragment將重新創(chuàng)建读跷,setRetainInstance(true)可使Fragment不走onDestory方法
  • 如果配置了ActivityFragment都不會重建
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梗搅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子效览,更是在濱河造成了極大的恐慌无切,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐枉,死亡現(xiàn)場離奇詭異哆键,居然都是意外死亡,警方通過查閱死者的電腦和手機瘦锹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門洼哎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沼本,你說我怎么就攤上這事噩峦。” “怎么了抽兆?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵识补,是天一觀的道長。 經(jīng)常有香客問我辫红,道長凭涂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任贴妻,我火速辦了婚禮切油,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘名惩。我一直安慰自己澎胡,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布娩鹉。 她就那樣靜靜地躺著攻谁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弯予。 梳的紋絲不亂的頭發(fā)上戚宦,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音锈嫩,去河邊找鬼受楼。 笑死垦搬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的艳汽。 我是一名探鬼主播猴贰,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骚灸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起慌植,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤甚牲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蝶柿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丈钙,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年交汤,在試婚紗的時候發(fā)現(xiàn)自己被綠了雏赦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡芙扎,死狀恐怖星岗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戒洼,我是刑警寧澤俏橘,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站圈浇,受9級特大地震影響寥掐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜磷蜀,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一召耘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褐隆,春花似錦污它、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虫埂,卻和暖如春祥山,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掉伏。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工缝呕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澳窑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓供常,卻偏偏與公主長得像摊聋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子栈暇,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容