鳳凰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 對象。