乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Android 系統(tǒng)中,那些能大幅提高工作效率的 API 匯總(持續(xù)更新中...)

       quasiceo 2018-01-09

      Android 系統(tǒng)中,那些能大幅提高工作效率的 API 匯總(持續(xù)更新中...)

      前言


      “條條大路通羅馬?!惫ぷ髦?,實現(xiàn)某個需求的方式往往不是唯一的,這些不同實現(xiàn)方式不僅表現(xiàn)在代碼質(zhì)量上,還影響著我們的工作效率。就像,在 Android 系統(tǒng)中,總有那么一些鮮為人知的 API 能夠減少我們很多零碎的工作量。于是,就想憑著一些經(jīng)驗,整理一些常用的,找個地方歸納總結(jié),也供日后翻閱。

      getResources().getIdentifier(String name, String defType, String defPackage)


      根據(jù)資源名稱獲取資源 id。正常情況下,我們會在代碼中直接根據(jù)資源ID獲取資源,比如:

      getResources().getDrawable(R.drawable.ic_launcher);

      但有時候,資源并不是固定的,需要根據(jù)使用情況從多個同類資源中動態(tài)選擇,比如根據(jù)服務(wù)器傳遞給客戶端的接口數(shù)據(jù)動態(tài)設(shè)置,怎么辦呢?設(shè)置一個硬編碼的映射關(guān)系數(shù)組?太繁瑣!不妨用上這個方法。

      一個完整的資源名為package:type/entry,對應(yīng)該方法的三個參數(shù):資源名稱、資源類型、應(yīng)用包名。舉幾個例子:

      imageView.setImageResource(getResources().getIdentifier("ic_launcher", "drawable", getPackageName()));
      
      radioGroup.check(getResources().getIdentifier("rb_indicator_" + position, "id", getPackageName()));

      實際使用過程中,第一個參數(shù) name,也就是資源名稱,根據(jù)需要動態(tài)設(shè)置,這就需要多個資源在命名時保持一定的規(guī)范格式。另外,需要注意的是,直接通過 id 獲取資源比通過名字的方式效率更高,所以,如果沒有這般特殊需求的話,不提倡使用這個方法獲取資源。

      TextUtils.isEmpty(CharSequence str)


      使用頻率超高的字符串判空方法,返回一個 boolean 值,內(nèi)部實現(xiàn)的判斷條件為:str == null || str.length() == 0。備受開發(fā)人員喜愛的一個 if 字符串判斷,系統(tǒng)已經(jīng)幫我們封裝過。

      Html.fromHtml()


      解析 Html 格式的富文本內(nèi)容,并返回一個帶樣式的字符串,供 TextView 等控件顯示??梢越鉀Q一些含超鏈接、圖文混排等格式的富文本內(nèi)容的顯示問題。

      DateUtils.formatDateTime()


      利用 Android SDK 提供的這個日期工具類可以將 long 類型的毫秒級時間數(shù)據(jù)格式化成特定顯示格式的字符串。通常我們使用 Java SDK 中的 SimpleDateFormat 格式化日期數(shù)據(jù),比如 new SimpleDateFormat("yyyy-MM-dd HH:mm").format(),DateUtils 的作用就是替我們封裝了這個過程。格式化結(jié)果與當(dāng)前設(shè)備的本地語言環(huán)境有關(guān)。這里列舉幾個常用 format 格式(中文環(huán)境下):

      • FORMAT_SHOW_DATE:3月3日
      • FORMAT_SHOW_TIME:10:37
      • FORMAT_SHOW_WEEKDAY:星期五
      • FORMAT_SHOW_YEAR:2017年3月3日
      • FORMAT_NUMERIC_DATE:3/3
      • FORMAT_NO_MONTH_DAY:三月

      Formatter.formatFileSize(Context context, long sizeBytes)


      格式化文件大小,將字節(jié)數(shù)據(jù)格式化為 B、KB、M 等單位的相應(yīng)數(shù)據(jù)。context 參數(shù)用于判斷返回結(jié)果的字符串順序,right-to-left 還是 left-to-right 形式的。這個工具類免去我們自己轉(zhuǎn)化計算的過程,非常方便,特別適用于應(yīng)用內(nèi)文件下載的類似場景。

      TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics)


      將指定單位的尺寸數(shù)據(jù)按照當(dāng)前設(shè)備屏幕信息轉(zhuǎn)化為相應(yīng)的像素值。其中,TypedValue 為第一個參數(shù)提供了常用的單位值,比如:

      • COMPLEX_UNIT_PX
      • COMPLEX_UNIT_DIP
      • COMPLEX_UNIT_PT
      • COMPLEX_UNIT_SP

      源碼如下:

      public static float applyDimension(int unit, float value, DisplayMetrics metrics){
          switch (unit) {
          case COMPLEX_UNIT_PX:
              return value;
          case COMPLEX_UNIT_DIP:
              return value * metrics.density;
          case COMPLEX_UNIT_SP:
              return value * metrics.scaledDensity;
          case COMPLEX_UNIT_PT:
              return value * metrics.xdpi * (1.0f/72);
          case COMPLEX_UNIT_IN:
              return value * metrics.xdpi;
          case COMPLEX_UNIT_MM:
              return value * metrics.xdpi * (1.0f/25.4f);
          }
          return 0;
      }

      其實在實際使用過程中,像素值都是 int 整數(shù)類型,而該方法返回的是 float 類型,如果直接強制轉(zhuǎn)換的話,會自動舍去小數(shù)部分。所以,如果不用該方法的話,通常我們會這么轉(zhuǎn)換:

      public static int convertDipToPx(Context context, int dip) {
          float scale = context.getResources().getDisplayMetrics().density;
          // 0.5f 用于向上取整
          return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));
      }

      Space


      官方注釋如下:

      Space is a lightweight View subclass that may be used to create gaps between components in general purpose layouts.

      Space 是一個用于創(chuàng)建視圖之間空隙的輕量級 View。在 onDraw() 方法中不執(zhí)行任何繪制,所以 android:background 屬性對他來說不起作用。通常我們使用 View 創(chuàng)建視圖間的空隙,在不考慮背景色的情況下,Space 其實效率更高。注意,由于是 API 14 引入的控件,如果需要向前兼容的話,需要使用到 support v4 包。

      view.performClick()


      自動調(diào)用 View 點擊事件。通常按鈕等控件只有在用戶點擊時才能觸發(fā)其點擊事件,該方法可以由某些特殊條件觸發(fā)模擬用戶點擊行為。類似的還有 performLongClick() 方法。

      Log.getStackTraceString(Throwable tr)


      Log 類提供的一個公共靜態(tài)方法,與常見的 Log.i() 等方法打印日志到 logcat 控制臺不同的是,該方法從 Throwable 對象中獲取錯誤信息,并以字符串的形式返回。當(dāng)你需要做錯誤信息的數(shù)據(jù)持久化,比如保存至本地存儲卡中或者上傳至服務(wù)器時,利用這個方法就非常方便。

      Linkify.addLinks()


      我們知道對于 TextView 文本控件中的內(nèi)容,通過 android:autoLink 屬性可以為其添加諸如 web、phone 等固定模版的超鏈接點擊事件。但畢竟系統(tǒng)模版有限,而利用 Linkify.addLinks() 方法可以添加一些應(yīng)用內(nèi)自定義模版,比如新浪微博中的 "@XXX" 格式的超鏈接跳轉(zhuǎn)等,都可以通過自定義正則表達(dá)式來匹配處理。

      getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)


      設(shè)置安全窗口,禁用系統(tǒng)截屏。防止 App 中的一些界面被截屏,并顯示在其他設(shè)備中造成信息泄漏。(常見手機設(shè)備系統(tǒng)截屏操作方式為:同時按下電源鍵和音量鍵。)

      比如支付寶 App 的“向商家付款”的包含付款二維碼的界面。(補充說明一點,微信付款界面不是這么做的,采用的是在 onResume() 生命周期方法中實時刷新付款二維碼,與支付寶在安全方法采取的手段不同。)

      攔截 Back 鍵,使 App 進入后臺而不是關(guān)閉


        @Override
        public void onBackPressed() {
          Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
          launcherIntent.addCategory(Intent.CATEGORY_HOME);
          startActivity(launcherIntent);
        }

      使用 Back 鍵返回桌面,但不關(guān)閉當(dāng)前應(yīng)用,而是使之進入后臺,就像按下 Home 鍵一樣。

      這個技巧厲害了。通常為了防止出現(xiàn)用戶誤按 Back 鍵退出 App 的情況,我們會在應(yīng)用首頁的 Activity 中監(jiān)聽返回鍵操作,使用 Toast 弱提示甚至 Dialog 強提示的方式給到用戶一個再次確認(rèn)的操作,但無法阻止用戶通過返回鍵逐步關(guān)閉應(yīng)用。

      然而,如果用這個方法攔截 App 最后一個 Activity(常見為首頁界面),既沒有阻礙用戶操作(回到桌面),又沒有關(guān)閉掉我們的應(yīng)用(后臺運行中),間接提高 App 的存活時間,真乃暗度陳倉。并且據(jù)我實驗,微信、支付寶、微博等 App 都是這么做的,大家不妨一試。

      ThumbnailUtils


      縮略圖工具類,可以根據(jù)本地視頻文件源、Bitmap 對象生成縮略圖,常用的公共靜態(tài)方法為:

      • createVideoThumbnail(String filePath, int kind)
      • extractThumbnail(Bitmap source, int width, int height)

      bitmap.extractAlpha()


      從源 bitmap 中根據(jù) alpha 獲取一個新的 bitmap 對象。比較繞口,通常 App 中的 Icon 多數(shù)是純色透明像素背景組成,利用這個方法可以對該圖的非透明區(qū)域著色,有多種使用場景,常見如 Button 的 pressed 狀態(tài),View 的陰影狀態(tài)等。舉個例子:

      private static Bitmap getDropShadow(ImageView iv, Bitmap src, float radius, int color) {
      
          final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
          paint.setColor(color);
      
          final int width = src.getWidth(), height = src.getHeight();
          final Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
          final Canvas canvas = new Canvas(dest);
          final Bitmap alpha = src.extractAlpha();
          canvas.drawBitmap(alpha, 0, 0, paint);
      
          final BlurMaskFilter filter = new BlurMaskFilter(radius, BlurMaskFilter.Blur.OUTER);
          paint.setMaskFilter(filter);
          canvas.drawBitmap(alpha, 0, 0, paint);
          iv.setImageBitmap(dest);
      
          return dest;
      }

      ArgbEvaluator


      系統(tǒng)提供的一個 TypeEvaluator ,我們只需要提供兩個起始顏色值和一個分值,系統(tǒng)會通過特定的算法計算得出一個新的顏色中間值。利用這個類,我們至少可以做兩件事情。

      第一,用于屬性動畫中。由于其實現(xiàn)了 TypeEvaluator 接口,可以用來做自定義屬性動畫的求值器,改變 View 的顯示狀態(tài)。比如:

      int colorStart = ContextCompat.getColor(this, R.color.black);
      int colorEnd = ContextCompat.getColor(this, R.color.green);
      ValueAnimator valueAnimator = ValueAnimator
          .ofObject(new ArgbEvaluator(), colorStart, colorEnd)
          .setDuration(3000);
      valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
          @Override
          public void onAnimationUpdate(ValueAnimator animation) {
              textView.setTextColor((Integer) animation.getAnimatedValue());
          }
      });
      valueAnimator.start();

      第二,利用該類提供的顏色求值算法,配合 ViewPager 提供的滑動偏離值使用。這種場景常見于使用 ViewPager 實現(xiàn)的引導(dǎo)頁,其背景色隨著滑動距離動態(tài)改變;使用 ViewPager 實現(xiàn)的 Tab 樣式菜單頁面,Tab 中文本內(nèi)容隨著滑動距離動態(tài)改變字體顏色(可以參考安卓版微信)。這兩種使用都使得 ViewPager 頁面切換過渡得很自然,體驗極佳。如:

      viewPager.addOnPageChangeListener(new OnPageChangeListener() {
          @Override
          public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
              new ArgbEvaluator().evaluate(positionOffset, startColor, endColor);
          }
      
          @Override
          public void onPageSelected(int position) {
      
          }
      
          @Override
          public void onPageScrollStateChanged(int state) {
      
          }
      });

      另外,關(guān)于顏色差值的計算,Google Sample 里有另一種算法,可參考 SlidingTabStrip.java 文件源碼,核心方法內(nèi)容如下:

      
      /**
      * Blend {@code color1} and {@code color2} using the given ratio.
      *
      * @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend,
      *              0.0 will return {@code color2}.
      */
      private static int blendColors(int color1, int color2, float ratio) {
          final float inverseRation = 1f - ratio;
          float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);
          float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);
          float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);
          return Color.rgb((int) r, (int) g, (int) b);
      }

      android:weightSum


      用于 LinearLayout 中,用于設(shè)置 Children weight 的總比重。在 LinearLayout 的 children 中,我們經(jīng)常會使用 android:layout_weight 按比例分配容器布局的空間,但有時候不一定會分完。以往,有些朋友可能會使用一個空 放在最后來達(dá)到末尾占位效果。如果你知道這個屬性的話,就能少寫一些代碼。

      android:descendantFocusability


      用于 ViewGroup 中,解決作為 Parent 的 ViewGroup 與 Children View 之間的焦點占用問題。最最常見的使用場景就是 list item 中含有一些點擊效果的控件,比如 Button、CheckBox 等,相信大家都遇到過。取值有三種,含義就不用再多說了:

      • afterDescendants
      • beforeDescendants
      • blocksDescendants

      android:duplicateParentState


      是否將 View 自身的 drawable state 交給直接 parent ViewGroup 控制,值為 boolean 類型。比如有一個 item 布局,item 中有一個 button,如果點擊 item layout 時,需要 button 呈現(xiàn)對應(yīng)的點擊效果,就可以在 button 中用到這個屬性。不過,從設(shè)計的角度來講,這種場景還是比較少見的。知道有這個屬性就好,不推薦這種交互設(shè)計。

      android:fillViewport


      ScrollView 的一個屬性,用于設(shè)置內(nèi)容部分是否填滿屏幕,主要針對內(nèi)容不足以填滿屏幕的情況。這里推薦一個使用技巧,參考我之前寫的文章:Android 日常開發(fā)中,兩個非常實用的布局技巧。

      android:adjustViewBounds


      使用 ImageView 時,你可能會用 android:scaleType 屬性設(shè)置圖片縮放方式。殊不知,android:adjustViewBounds 屬性也能起到類似的效果。但要注意的是,后者需要至少指定 ImageView 寬高中的一個屬性,或者 maxHeight 之類的,然后另一個屬性隨之適配。這個屬性用在列表中較為合適,比如 App 中的活動列表頁面,圖片寬度設(shè)置為 match_parent,然后高度設(shè)為 wrap_content 使其自適應(yīng),這樣便能保證從服務(wù)獲取的高分辨率圖片在不同的屏幕中不被拉伸變形。(備注:最好在項目資源文件中放置一個與網(wǎng)絡(luò)圖片相同尺寸的默認(rèn)圖,起到 placeholder 作用,避免圖片顯示前高度為 0 的較差體驗。)

      持續(xù)更新中...


      本文先記這么多吧,日積月累,后續(xù)持續(xù)更新中,敬請關(guān)注...(當(dāng)然,你有什么高效而又少見的 API,歡迎一起分享交流哦~)

      歡迎關(guān)注我的微信公眾號


      安卓筆記俠:專注于 Android 開發(fā),和程序員之路。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多