-
aaaa查看全部
-
popwindow的布局查看全部
-
單例模式雙判斷查看全部
-
雙重判斷,提高效率查看全部
-
ExecuterService 線程池查看全部
-
兩點需要優化: 1.看一下微信的圖片選擇器,在點擊底部布局彈出popupWindow時,底部布局以及上面的APP title并不會變暗 2.popupWindow彈出的listView每一項都有后面的一個勾,這個勾不是始終勾上的,只有在點擊listView時才會打鉤。查看全部
-
為popupWindow設置動畫效果 1.anim中創建兩個動畫xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="100%" android:toYDelta="0" android:duration="200" /> </set> 2.style.xml添加對應的動畫變量 <style name="dir_popupwindow_anim"> <item name="android:windowEnterAnimation">@anim/slide_up</item> <item name="android:windowExitAnimation">@anim/slide_down</item> </style> 3.MainActivity中為控件設置動畫 mDirPopupWindow.setAnimationStyle(R.style.dir_popupwindow_anim);查看全部
-
為popupWindow添加一個動畫 1.在res/anim/下創建兩個動畫 slide_up和slide_down <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="100%" android:toYDelta="0" android:duration="200" /> </set> 2.style.xml添加對應的動畫 <style name="dir_popupwindow_anim"> <item name="android:windowEnterAnimation">@anim/slide_up</item> <item name="android:windowExitAnimation">@anim/slide_down</item> </style> 3.在MainActivity中啟動popupWindow時就要設置前面的動畫 mDirPopupWindow.setAnimationStyle(R.style.dir_popupwindow_anim);查看全部
-
通過接口回調實現ListView中item的選擇事件 6.回調MainActivity中,為popupWindow設置一個監聽 利用傳入的folderBean變量,更新GridView中的數據 mDirPopupWindow.setOnDirSelectedListener(new ListImageDirPopupWindow.OnDirSelectedListener() { @Override public void onSelected(FolderBean folderBean) { mCurrentDir = new File(folderBean.getDir()); mImgs = Arrays.asList(mCurrentDir.list(new FilenameFilter() { …… })); mImageAdapter = new ImageAdapter(MainActivity.this, mImgs, mCurrentDir.getAbsolutePath()); mGridView.setAdapter(mImageAdapter); mDirName.setText(folderBean.getName()); mDirCount.setText(folderBean.getCount() + ""); mDirPopupWindow.dismiss(); } }); 7.兩個小改動 (1)FolderBean類中的setDir(),目錄路徑名應該是最后一個/后面的字符串 int lastIndexOf = this.dir.lastIndexOf("/") + 1; this.name = this.dir.substring(lastIndexOf); (2)popupWindow中的listView每個item的布局文件中左邊的ImageView android:scaleType="fitXY" http://blog.csdn.net/larryl2003/article/details/6919513查看全部
-
通過接口回調實現ListView中item的選擇事件 1.先說一下解耦 簡單講就是解除耦合,耦合就是兩個體系或兩種運動形式相互作用而聯合起來的現象。解除耦合就是將兩者分離開來單獨分析,來降低兩者的依存性。 這里要將MainActivity和PopupWindow解耦,就是降低它們的耦合度 2.主要思路: 在ListImageDirPopupWindow的initEvent()中為ListView設置OnItemClickListener接口,然后設置一個接口回調到MainActivity中。在MainActivity設置這個接口的監聽,最終回調到MainActivity的具體實現。 這樣的話,兩者就解耦了,MainActivity設置了接口監聽,它才能知道popupWindow中發生的回調。 參考UI模板中的接口回調:http://www.xianlaiwan.cn/space/note/cid/247 接下來看實現。 3.創建一個接口,類似于mButton.setOnClickListener(new OnClickListener(){})的OnClickListener接口 public interface OnDirSelectedListener{ //mListView的接口回調,參數中包含了當前圖片目錄 public void onSelected(FolderBean folderBean); } 4.創建設置監聽接口的方法,類似于setOnClickListener() public OnDirSelectedListener mListener; public void setOnDirSelectedListener(OnDirSelectedListener listener){ this.mListener = listener; } 5.為ListView設置監聽,代碼如圖 這樣MainActivity想要監聽的話就要調用setOnDirSelectedListener(OnDirSelectedListener listener)傳入它的listener,當選中item時就會回調到MainActivity中的實現 mListener.onSelected(mDatas.get(position));查看全部
-
初始化popupWindow點擊事件 1.在MainActivity中,initDatas()這個方法是掃描所有的圖片,其中已經得到了popupWindow的數據源集合 mFolderBeans.add(folderBean); //popwindow的數據源集合 掃描完成后通知主線程加載數據源到View中去,在handleMessage()中初始化popupWindow initDirPopupWindow(); //初始化popupWindow,加載數據源到ListView中 2.initDirPopupWindow()中需要設置一個dismiss事件,作用在于popupWindow消失/出現時,背景需要變亮/變暗 private void initDirPopupWindow() { mDirPopupWindow = new ListImageDirPopupWindow(this, mFolderBeans); mDirPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { public void onDismiss() { lightOn(); } }); } 3.內容區域變亮 private void lightOn() { WindowManager.LayoutParams lp = getWindow().getAttributes(); //得到window的布局參數 lp.alpha = 1.0f; getWindow().setAttributes(lp); } 變暗的方法類似 4.為popupWindow添加點擊事件 private void initEvent() { mBottomLy.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mDirPopupWindow.showAsDropDown(mBottomLy, 0, 0); //設置顯示位置為底部 lightOff(); } }); }查看全部
-
初始化控件 1.initViews()方法 private void initViews(Context context) { mListView = (ListView) mConvertView.findViewById(R.id.id_list_dir); mListView.setAdapter(new ListDirAdapter(context, mDatas)); } 注意這里傳入了context參數 2.在popupWindow中創建一個ListDirAdapter類,作為ListView的adapter private class ListDirAdapter extends ArrayAdapter<FolderBean> (1)構造函數 public ListDirAdapter(Context context, List<FolderBean> objects) { super(context, 0, objects); mFlater = LayoutInflater.from(context); } (2)getView()方法,也是通過ViewHolder的文藝式 private class ViewHolder{ ImageView mImg; TextView mDirName; TextView mDirCount; } (2)初始設置 FolderBean bean = getItem(position); //得到當前位置的FolderBean holder.mImg.setImageResource(R.mipmap.pictures_no); //初始設置 (3)為當前item的三個控件設置內容 ImageLoader.getInstance(3,ImageLoader.Type.LIFO).loadImage(bean.getFirstImgPath(), holder.mImg); holder.mDirName.setText(bean.getName()); holder.mDirCount.setText(bean.getCount());查看全部
-
popupWindow的變量和構造方法 1.新建一個類集成PopupWindow,實現popup window 2.這個popupWindow需要完成: (1)寬和高 private void calWidthAndHeight(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); mWidth = outMetrics.widthPixels; mHeight = (int) (outMetrics.heightPixels * 0.7); } (2)將popupWindow的布局文件inflate成View mConvertView = LayoutInflater.from(context).inflate(R.layout.popup_main, null); (3)還有一些屬性的設置 setFocusable(true); setTouchable(true); setOutsideTouchable(true); //可以點擊popupWindow的其他區域 setBackgroundDrawable(new BitmapDrawable()); (4)設置點擊外部區域的操作 setTouchInterceptor(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE){ dismiss(); return true; } return false; } });查看全部
-
保存選中的圖片——每個圖片ImageView的點擊事件 1.為了更方便的處理點擊事件,需要將ImageAdapter類獨立出來 創建一個靜態Set集合來保存選中的圖片 private static Set<String> mSeletedImg = new HashSet<String>(); 2.給每個ImageView設置一個點擊事件 viewHolder.mImg.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (mSeletedImg.contains(filePath)){ //已經被選擇 mSeletedImg.remove(filePath); viewHolder.mImg.setColorFilter(null); viewHolder.mSelect.setImageResource(R.mipmap.picture_unselected); }else { mSeletedImg.add(filePath); viewHolder.mImg.setColorFilter(Color.parseColor("#77000000")); viewHolder.mSelect.setImageResource(R.mipmap.pictures_selected); } //notifyDataSetChanged(); } }); 3.判斷每個圖片是否處于被選中的狀態 if (mSeletedImg.contains(filePath)){ viewHolder.mImg.setColorFilter(Color.parseColor("#77000000")); viewHolder.mSelect.setImageResource(R.mipmap.pictures_selected); } 4.需要注意notifyDataSetChanged()每次都要刷新數據,所以只要點擊圖片會有閃頻現象,改進一下: 在判斷當前圖片是否被選中時就做處理(見第2點)查看全部
-
適配器 1.圖片掃描完成后就要通知主線程,加載數據源到GridView中 private android.os.Handler mHandler = new android.os.Handler(){ public void handleMessage(Message msg) { if(msg.what == DATA_LOADED){ mProgressDialog.dismiss(); //綁定數據源到GridView中 data2View(); } } }; data2View()是加載數據源到gridView中的方法 2.接下來就要為GridView創建一個ImageAdapter,重點是getView()方法是對每個Item而言的 (1)GridView中的item布局是一個RelativeLayout,包含一個ImageView和一個ImageButton (2)通過ViewHolder(文藝式)完成getView() http://www.xianlaiwan.cn/space/note/uid/1859625/t/my/cid/365 (3)最后要注意(如圖) ImageLoader.getInstance(3, ImageLoader.Type.LIFO).loadImage(mDirPath + "/" +mImgPaths.get(position), viewHolder.mImg); 傳入的參數為圖片的路徑地址,以及對應要填充進去的ImageView 3.回到主線程的handleMessage()中,圖片掃描完之后就要創建GridView對應的ImageAdapter,然后加載 mImgs = Arrays.asList(mCurrentDir.list()); //得到當前目錄下所有的圖片名的集合 mImageAdapter = new ImageAdapter(this, mImgs, mCurrentDir.getAbsolutePath()); //GridView對應的adapter mGridView.setAdapter(mImageAdapter); //setAdapter()會將每個item的View顯示到GridView中。查看全部
舉報
0/150
提交
取消