鳳凰demo小節(jié)

鳳凰demo小節(jié)

  • 再做一個demo時呢,首先一定得確定需求,具體實現(xiàn)先放一邊。

  • 再以需求為目的,擴展出需要的工具,與之涉及的實體類。

  • 也應(yīng)確定大致需要用到那些控件,對每個控件的應(yīng)用呢都應(yīng)該有基本的認識。

  • 千萬不能忘記在androidManifest 中添加應(yīng)用需要的權(quán)限。

新認識的控件

  • StaggeredGridLayoutManager類是RecyclerView的另一個布局管理類,其類構(gòu)造函數(shù)接收兩個參數(shù),參數(shù)一為同一個水平(或同一個垂直)有幾個子項布局,參數(shù)二為子項布局放置方向。

  • cardView 多用在RecyclerView中的子項布局,以卡片的形式包裹內(nèi)容。容器類型的布局。

  • circleimageview 此控件呢會把bitmap的圖片以圓形的形式顯示。

  • glide是一個自帶緩存的圖片加載庫。
    基本的使用方式如下所示:

      public static void  loadpicture(String url, ImageView view){
          Glide.with(MyApplicatioin.getContext()).
              load(url).
              error(R.drawable.ic_image_loadfail).
              into(view);
      }
    

    with方法參數(shù)要傳入Context參數(shù),以構(gòu)建環(huán)境,

    load方法參數(shù)傳入需要加載的圖片url(即圖片地址)。

    error方法參數(shù)傳入在沒有找到圖片url的情況下(錯誤),顯示的圖片。

    into方法參數(shù)為需要顯示圖片的View 控件。

保存圖片的方法

需注意的地方有:保存位圖時呢,調(diào)用bitmap對象的compress方法()就可保存圖片,此方法呢接收三個參數(shù)。參數(shù)一為保存bitmap的格式,一般有png與jpg
,參數(shù)二圖片的壓縮率,無論是那種格式千萬不能傳入100即意為100%的壓縮率,程序會崩潰的。參數(shù)三保存位圖的fileOutputStream對象。以png格式保存圖片呢,多少的壓縮率都無所謂。
構(gòu)建bitmap保存的路徑時,并不需要文件的存在,有路徑就好,compress方法會自動創(chuàng)建文件。在保存時最好開啟子線程來做事,用java流寫文件還是蠻費時的。當(dāng)使用glide加載圖片后呢,要獲取imageView的bitmap一定把imageView對象getDrawable()獲取的對象轉(zhuǎn)型為GlideBitmapDrawable然后再用getBitmap()方法獲取位圖,這樣才能保存進去。

public static File file;

public synchronized static Boolean saveBitmap(final Bitmap bitmap , String jpgMark) {
    try {
        file = new File(Environment.getExternalStoragePublicDirectory("Icon"),"zuimei"+jpgMark+".png");
        if(!file.exists()){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    FileOutputStream outputStream = null;
                    try {
                        outputStream = new FileOutputStream(file);
                        bitmap.compress(Bitmap.CompressFormat.PNG,99, outputStream);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }finally {
                        try {
                            if(outputStream != null) {
                                outputStream.close();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
            return true;
        }else {
            return false;
        }
    }catch (Exception e){
        e.printStackTrace();
        return false;
    }
}

問題小節(jié)

  • 編寫RecyclerView的子項視圖時呢,高度設(shè)置成wrap-content就好,或者顯示圖片的子項視圖呢直接規(guī)定需要多少dp就好。

  • 在編寫RecyclerView的每個項目的點擊事件時,直接在viewHolder對象構(gòu)造函數(shù)里注冊,可以提高性能。

        private OnitemClickListener itemlistener;
    
         public void setOnitemClickListener(OnitemClickListener listener) {
          this.itemlistener = listener;
      }
    
      class ZmImageHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
      private ImageView imageView;
      private TextView mText;
      public ZmImageHolder(View itemView) {
          super(itemView);
          itemView.setOnClickListener(this);
          imageView = (ImageView) itemView.findViewById(R.id.image_content_main2);
          mText = (TextView) itemView.findViewById(R.id.image_content_text2);
      }
      @Override
      public void onClick(View view) {
          if (itemlistener != null)
              itemlistener.onitemClick(view,zmlist.get(this.getLayoutPosition()));
          }
        }
      }
    

其中呢通過viewholder對象的getLayoutPosition()方法來獲得當(dāng)前position(子項布局位置)

  • 當(dāng)兩個碎片同時添加在同一個fragmelayout時,即時調(diào)用hide()了,也出現(xiàn)重疊時呢,一定要在fragment的根布局中設(shè)置背景為白色。

  • 在activity中用getSupportFragmentManager()方法呢可以獲取到管理V4包里碎片的管理對象,但是如果需要在fragment中再使用碎片,就不能通過此方法獲取FragmentManager對象,因可能出現(xiàn)白頁情況。
    需使用getChildFragmentManager()方法來獲取子碎片的fragmentManager對象,才能正確顯示內(nèi)容。

  • 某些情況下,一定要加對象為空的判斷,不然極易出現(xiàn)空指針的情況。activity一般在調(diào)用finish()方法,那些view對象也就被回收了,因其主宿主都已經(jīng)被銷毀了。

  • 有些基本需要多次寫的就應(yīng)該創(chuàng)建一個父類,然后新類繼承就好。比如activity 和 Fragment。


  • 當(dāng)創(chuàng)建java流對象后,寫完或讀完后一定要調(diào)用close()方法關(guān)閉了。要得到最終的流對象,至少需要一個對象來裝飾,第一個對象呢是最終寫入或讀取的目標,第二對象用來裝飾流的行為。如果要操作的內(nèi)容中含有中文時呢,還需要一個適配器對象把InputStream或OutputStream轉(zhuǎn)換為Reader或Writer對象。

          inputStream = MyApplicatioin.getContext().openFileInput(filName);
          reader = new BufferedReader(new InputStreamReader(inputStream));
           outputStream = MyApplicatioin.getContext().openFileOutput(fileName, Context.MODE_PRIVATE);
           writer = new BufferedWriter(new OutputStreamWriter(outputStream));
    

  • 從服務(wù)器返回的json數(shù)據(jù)呢,有以下兩種處理方式:

      private  String loadPhoenix(String response , int postion) throws JSONException {
      JSONArray jsonArray = new JSONArray(response);
      return jsonArray.getJSONObject(postion).getString("item");
      }
    
      private  String loadZm(String response) throws JSONException {
      JSONObject object = new JSONObject(response);
      return object.getJSONObject("data").getString("images");
      }
    

因view視圖需要的實體類呢,會被一層層的包裹起來,所以就需提出我們需要那部分內(nèi)容。
方法一對應(yīng)的時,服務(wù)器直接返回的是數(shù)組形式,且屬于item這個鍵名才能獲取到。
方法二對應(yīng)的是,服務(wù)返回的為對象,對象套對象,然后獲取images的json內(nèi)容。
json數(shù)據(jù)是通過鍵對值得形式保存的。{}表示對象,[]表示數(shù)組。


  • 透明狀態(tài)欄和透明導(dǎo)航欄,在activity的onCreate方法中進行操作。(只有安卓5.0才支持)

      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
          Window window = getWindow();
          window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                  |View.SYSTEM_UI_FLAG_LAYOUT_STABLE |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
          // window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
          window.setNavigationBarColor(Color.TRANSPARENT);
          window.setStatusBarColor(Color.parseColor("#cccc99"));
      }
    

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION表示讓應(yīng)用的UI布局延伸到狀態(tài)欄和導(dǎo)航欄.
一定不能少SYSTEM_UI_FLAG_LAYOUT_STABLE此flag。最后再把兩者的顏色設(shè)置為透明色。

SYSTEM_UI_FLAG_HIDE_NAVIGATION和
SYSTEM_UI_FLAG_FULLSCREEN表示直接把狀態(tài)欄和導(dǎo)航欄隱藏。
SYSTEM_UI_FLAG_IMMERSIVE_STICKY表示讓應(yīng)用內(nèi)容變?yōu)槌两降?,不為因點擊就顯示狀態(tài)欄和導(dǎo)航欄,就像安卓游戲那樣。

  • RecyclerView要設(shè)置OnScrollListener呢,通過addOnScrollListener()方法,要解除呢通過clearOnScrollListener()方法。復(fù)寫

        public void onScrollStateChanged(RecyclerView recyclerView, int newState) 與 public void onScrolled(RecyclerView recyclerView, int dx, int dy) 。
    

參數(shù)newState為當(dāng)前RecyclerView的狀態(tài)值
RecyclerView.SCROLL_STATE_IDLE 表示視圖不在滾動。

參數(shù)dx,dy為當(dāng)前坐標,通過存儲上次的值,兩次再減就能得出滑動方向。

通過布局管理器對象的findLastVisibleItemPosition()方法獲取子項最后可見的position,

  • 當(dāng)使用DialogFragment時,用onCreateView()創(chuàng)建視圖不加載時呢,就要使用onCreateDialog()方法,創(chuàng)建一個AlertDialog對象,并調(diào)用setView()方法顯示的view,最后再返回一個AlerDialog 對象。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容