中華新聞
- 側(cè)邊欄
setContentView(R.layout.activity_main);
// 添加側(cè)邊欄
setBehindContentView(R.layout.left_menu);
SlidingMenu slidingMenu = getSlidingMenu();
// 全屏觸摸
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
// 屏幕預留200像素
// 代碼適配
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
slidingMenu.setBehindOffset((int) (width * 0.625));
initFragment(); - 填充碎片
private void initFragment() {
// Fragment管理器
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();// 開始事務
// 將幀布局替換為對應的Fragment
transaction
.replace(R.id.fl_content, new ContentFragment(), TAG_CONTENT);
transaction.replace(R.id.fl_left_menu, new LeftMenuFragment(),
TAG_LEFT_MENU);
transaction.commit();// 提交事務
// fm.findFragmentByTag(TAG_CONTENT);
} - 事件的分發(fā)機制
分發(fā)機制 - 側(cè)邊欄有
第三方登入:
友盟+
Mob Android Single Sign-On (SSO)
跳轉(zhuǎn)到登入界面:
@Override
public void next_activity() {
// 跳轉(zhuǎn)到第二個界面
Intent intent = new Intent(this, SetUp2Activity.class);
startActivity(intent);
finish();
//執(zhí)行平移動畫
//執(zhí)行界面切換動畫的操作,是在startActivity或者finish之后執(zhí)行
//enterAnim : 新的界面進入的動畫
//exitAnim : 舊的界面退出的動畫
overridePendingTransition(R.anim.setup_enter_next, R.anim.setup_exit_next);
}
動畫效果:
setup_enter_next android:fromXDelta="100%" android:toXDelta="0"
setup_exit_next android:fromXDelta="0%" android:toXDelta="-100"
-
主頁
0. 整個是個viewPager
1. topBar
2. viewPagerIndicator(第三方工具)
3.子嵌套的viewPager,可以修改viewPager的源碼
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
this.getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
3. listView
TextView ImgerView組成(3小時前)
有圖片就VISIBIbY,沒有圖片就GONE
4. PullToRefresh(沒有用到)
被Goggle官方出品的SwiperRefreshLayout(自動刷新)代替啦,
好想是android5.0 出現(xiàn)的各聘,知乎就是這的這個俩檬。
5. 加載數(shù)據(jù)
xutls中的htttpUtils
還有android自帶的HttpURLConnection(URLConnection的子類)
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
conn.connect();int code = conn.getResponseCode(); if (code == 200) { InputStream is = conn.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(is); // 將圖片存到本地 localCacheUtils.setBitmapToLocal(bitmap, url); // 將圖片存到內(nèi)存 memoryCacheUtils.setBitmapToMemory(url, bitmap); return bitmap; } 6. 網(wǎng)絡請求哪家強 優(yōu)先推薦Retrofit, 需要遵循RESTful的風格和能力掌握 Volley, 畢竟Volley你不需要做過度的封裝, 當然不適合傳大數(shù)據(jù)(圖片)式撼。 okHttp性能最高, 但是必須要做一些封裝佳吞。 ImagerLoader被Volley封裝 高效: OkHttp > Retrofit > Volley 健壯性: Retrofit > Volley > OkHttp 易用性: Volley > OkHttp > Retrofit 7. 圖片三級緩存機制 網(wǎng)絡緩存 public void getBitMapFormNet(ImageView iv, String url) { BitmapTask bitmap = new BitmapTask(); bitmap.execute(iv, url); } ** AsyncTask<Params, Progress, Result> ** class BitmapTask extends AsyncTask<Object, Integer, Bitmap> { private ImageView imageView; // 主線程, 預處理 @Override protected void onPreExecute() { super.onPreExecute(); } // 子線程運行 @Override protected Bitmap doInBackground(Object... params) { imageView = (ImageView) params[0]; mUrl = (String) params[1]; // 設(shè)置標識 imageView.setTag(mUrl); return download(imageView, mUrl); } // 主線程運行 @Override protected void onPostExecute(Bitmap result) { super.onPostExecute(result); if (result != null) { String url = (String) imageView.getTag(); if (mUrl.equals(url)) { imageView.setImageBitmap(result); System.out.println("從網(wǎng)絡中下載圖片成功!"); } } } // 主線程運行, 進度不斷更新方法 @Override protected void onProgressUpdate(Integer... values) { } } 8. 通過BitmapFactory解碼(獲取)Bitmap的幾種方式 **decodeFile()** //從SD卡文件讀取 **decodeResource()**//從資源文件res讀取 **decodeStream()** //從輸入流讀取 **decodeByteArray()** //從字節(jié)數(shù)組讀取
資訊
list_item下的 一個圖片 下面4個小圖片ListView包含不同Item的布局
1. 重寫 getViewTypeCount() – 該方法返回多少個不同的布局
2. 重寫 getItemViewType(int) – 根據(jù)position返回相應的Item
3. 根據(jù)view item的類型欠肾,在getView中創(chuàng)建正確的convertView城市
和資訊的布局一模一樣-
設(shè)置(了解)
builder.setTitle("字體設(shè)置");
String[] items = new String[] { "超大號字體", "大號字體", "正常字體", "小號字體",
"超小號字體" };
builder.setSingleChoiceItems(items, mSelectItem,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mCurrentItem = which;
}
});
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {@Override public void onClick(DialogInterface dialog, int which) { WebSettings settings = mWebView.getSettings(); switch (mCurrentItem) { case 0: settings.setTextSize(TextSize.LARGEST); break; case 1: settings.setTextSize(TextSize.LARGER); break; case 2: settings.setTextSize(TextSize.NORMAL); break; case 3: settings.setTextSize(TextSize.SMALLER); break; case 4: settings.setTextSize(TextSize.SMALLEST); break; default: break; } // 將最終選擇的狀態(tài)賦值給初始化狀態(tài) mSelectItem = mCurrentItem; } });
-
獲取緩存,清理緩存
PackageManager pm = getPackageManager();
//pm.getPackageSizeInfo("com.example.writecache", mStatsObserver);
/**
* 10-22 05:24:52.906: I/System.out(15794): cachesize:4.00KB codesize:0.96MB datasize:0.00B
*/
//反射獲取緩存
try {
Class<?> loadClass = MainActivity.class.getClassLoader().loadClass("android.content.pm.PackageManager");
Method method = loadClass.getDeclaredMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);
//receiver : 類的實例,隱藏參數(shù),方法不是靜態(tài)的必須指定
method.invoke(pm, "com.example.writecache",mStatsObserver);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() { public void onGetStatsCompleted(PackageStats stats, boolean succeeded) { long cachesize = stats.cacheSize;//緩存大小 long codesize = stats.codeSize;//應用程序的大小 long datasize = stats.dataSize;//數(shù)據(jù)大小 String cache = Formatter.formatFileSize(getApplicationContext(), cachesize); String code = Formatter.formatFileSize(getApplicationContext(), codesize); String data = Formatter.formatFileSize(getApplicationContext(), datasize); System.out.println("cachesize:"+cache +" codesize:"+code+" datasize:"+data); } }; **權(quán)限 Android_UserPerssion_getPakeragerSize;**
獲取清理緩存(小妖)
1 遍歷getCacheDir下的所有文件,計算每個文件的大小即可
2 清除也是一樣,遍歷所有文件的大小,刪除即可
3 file.length() 返回的是文件的大小(單位b)新聞搜索(時間過長)
1 由于數(shù)據(jù)過大关炼,應該是服務器那邊的, 關(guān)鍵字查詢
2 服務器器會返回相關(guān)數(shù)據(jù)給我
3 里面的一些數(shù)據(jù), 基本是都是html的形式, 已經(jīng)排好.評論
1.沒什么作用
2.發(fā)現(xiàn)起始就是頭布局壓縮啦涩笤! 關(guān)于他的topBar-
Android 實現(xiàn)變色狀態(tài)欄
// 保留狀態(tài)的位置 <item name="android:fitsSystemWindows">true</item> Google 了之后在 Github 找到了一個開源項目 【SystemBarTint】
Github開源項目 SystemBarTint
自己封裝后
// 初始化窗體
@SuppressLint("ResourceAsColor")
@TargetApi(19)
private void initWindow() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
mTintManager = new SystemBarTintManager(this); // 色彩管理者
mColorPicker = new ColorPicker(this); // 獲取顏色采集器
// mTintManager.setStatusBarTintColor(R.color.main_color);
mTintManager.setStatusBarTintEnabled(true); // 設(shè)置狀態(tài)欄可用
int color = Color.argb(100, 255, 0, 0);
mTintManager.setTintColor(color); // 設(shè)置色彩顏色
}
}
關(guān)于(結(jié)束)
-
效仿QQ昆淡、微信锰瘸、新浪的圓形頭像
- 將原圖居中裁剪成正方形
- 根據(jù)指定的寬度對正方形進行縮放
- 裁剪成圓形
酒心網(wǎng)###
- 定位
定位方式#
gps一種定位方式
1.wifi定位,IP地址,根據(jù)你的IP地址獲取你的地理位置,精確度不是特別高了
2.基站定位,基站就是為電話服務,信號的強弱決定了你離基站的距離,精確度比較高,幾十米--幾公里,精確度取決于基站的個數(shù)
wifi定位和基站定位局限性:不能定位海拔
3.gps定位,gps定位衛(wèi)星進行定位,使用最少衛(wèi)星實現(xiàn)全球定位,去和
gps定位衛(wèi)星進行通訊來獲取定位坐標,通過光波進行通訊,必須得到
空曠地方才能進行定位,連接至少需要一分鐘,耗電,精確度特別高,不
需要聯(lián)網(wǎng),聯(lián)網(wǎng):agps技術(shù),通過聯(lián)網(wǎng)來修正獲取的坐標,特別準確的
百度定位sdk gps
高德 sdk
定位的具體代碼
android.permission.ACCESS_MOCK_LOCATION : 模擬位置的權(quán)限,模擬器中必須加的,真機可加可不加
android.permission.ACCESS_FINE_LOCATION : 精確位置的權(quán)限,真機必須添加
android.permission.ACCESS_COARSE_LOCATION : 大概位置的權(quán)限,真機必須添加
passive : 被動,基站定位
gps : gps定位
定位的步驟
1.獲取位置的管理者
//1.獲取位置的管理者
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
2.獲取定位方式
//2.獲取定位方式
//2.1獲取所有的定位方式
//enabledOnly : true : 返回所有可用的定位方式
List<String> providers = locationManager.getProviders(true);
for (String string : providers) {
System.out.println(string);
}
//2.2獲取最佳的定位方式
Criteria criteria = new Criteria();
criteria.setAltitudeRequired(true);//設(shè)置是否可以定位海拔,true:可以定位海拔,一定返回gps定位
//criteria : 設(shè)置定位的屬性,決定使用什么定位方式的
//enabledOnly : true : 定位可用的就返回
String bestProvider = locationManager.getBestProvider(criteria, true);
System.out.println("最佳的定位方式:"+bestProvider);
3.定位操作
a.定位
//provider : 定位方式
//minTime : 定位的最小時間間隔
//minDistance : 定位的最小距離間隔
//listener : LocationListener
locationManager.requestLocationUpdates(bestProvider, 0, 0, myLocationListener);
b.LocationListener
private class MyLocationListener implements LocationListener{
//當定位位置改變的時候調(diào)用
//location : 當前的位置
@Override
public void onLocationChanged(Location location) {
double latitude = location.getLatitude();//獲取緯度,平行
double longitude = location.getLongitude();//獲取經(jīng)度
textview.setText("longitude:"+longitude+" latitude:"+latitude);
}
//當定位狀態(tài)改變的時候調(diào)用
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
//當定位可用的時候調(diào)用
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
//當定位不可用的時候調(diào)用
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
}
4.關(guān)閉gps定位
@Override
protected void onDestroy() {
super.onDestroy();
//關(guān)閉gps定位,高版本中已經(jīng)不能這么做了,高版本中規(guī)定關(guān)閉和開啟gps必須交由用戶自己去實現(xiàn)
locationManager.removeUpdates(myLocationListener);
}
GPS定位城市需要做兩個步驟:
1瘪撇、取得用戶當前位置的經(jīng)度获茬,緯度。
2倔既、根據(jù)經(jīng)緯度轉(zhuǎn)換成城市名稱恕曲。
經(jīng)緯度轉(zhuǎn)換成城市名稱,只能使用地圖服務了渤涌。自己做不來佩谣。
地圖服務API有兩個,一個是百度地圖实蓬,一個是谷歌地圖茸俭。百度地圖API
調(diào)用需要注冊百度帳號,并申請APP_KEY安皱,谷歌地圖API直接調(diào)用即可调鬓。
百度地圖API調(diào)用地址:
http://api.map.baidu.com/geocoder?output=json&location=緯度,經(jīng)度&key=APP_KEY
QuickSideBar
幫助快速查閱對應分組的側(cè)邊欄,可以配合任意列表酌伊,demo中給出配合RecyclerView(浮動分組使用stickyheadersrecyclerview)腾窝。
項目地址:https://github.com/saiwu-bigkoo/Android-QuickSideBar
支付方式
-
窗體小控件
View contentView = View.inflate(getApplicationContext(), R.layout.popu_window, null);
//contentView : 顯示view對象
//width,height : view寬高
popupWindow = new PopupWindow(contentView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
//4.獲取條目的位置,讓氣泡顯示在相應的條目
int[] location = new int[2];//保存x和y坐標的數(shù)組
view.getLocationInWindow(location);//獲取條目x和y的坐標,同時保存到int[]
//獲取x和y的坐標
int x = location[0];
int y = location[1];
//parent : 要掛載在那個控件上
//gravity,x,y : 控制popuwindow顯示的位置
popupWindow.showAtLocation(parent, Gravity.LEFT | Gravity.TOP, x+50, y);隱藏氣泡 /** * 隱藏氣泡 */ private void hidePopuwindow() { if (popupWindow != null) { popupWindow.dismiss();//隱藏氣泡 popupWindow = null; } } //6.設(shè)置動畫 //縮放動畫 //前四個 : 控制控件由沒有變到有 動畫 0:沒有 1:整個控件 //后四個:控制控件是按照自身還是父控件進行變化 //RELATIVE_TO_SELF : 以自身變化 //RELATIVE_TO_PARENT : 以父控件變化 ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f); scaleAnimation.setDuration(500); //漸變動畫 AlphaAnimation alphaAnimation = new AlphaAnimation(0.4f, 1.0f);//由半透明變成不透明 alphaAnimation.setDuration(500); //組合動畫 //shareInterpolator : 是否使用相同的動畫插補器 true:共享 false:各自使用各自的 AnimationSet animationSet = new AnimationSet(true); //添加動畫 animationSet.addAnimation(scaleAnimation); animationSet.addAnimation(alphaAnimation); //執(zhí)行動畫 contentView.startAnimation(animationSet); 給popuwindow設(shè)置背景 popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));