中华新闻
- 侧边栏
setContentView(R.layout.activity_main);
// 添加侧边栏
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);
} - 事件的分发机制
分发机制 - 侧边栏有
第三方登入:
友盟+
Mob Android Single Sign-On (SSO)
跳转到登入界面:
@Override
public void next_activity() {
// 跳转到第二个界面
Intent intent = new Intent(this, SetUp2Activity.class);
startActivity(intent);
finish();
//执行平移动画
//执行界面切换动画的操作,是在startActivity或者finish之后执行
//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 出现的,知乎就是这的这个。
5. 加载数据
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); // 将图片存到内存 memoryCacheUtils.setBitmapToMemory(url, bitmap); return bitmap; } 6. 网络请求哪家强 优先推荐Retrofit, 需要遵循RESTful的风格和能力掌握 Volley, 毕竟Volley你不需要做过度的封装, 当然不适合传大数据(图片)。 okHttp性能最高, 但是必须要做一些封装。 ImagerLoader被Volley封装 高效: OkHttp > Retrofit > Volley 健壮性: Retrofit > Volley > OkHttp 易用性: Volley > OkHttp > Retrofit 7. 图片三级缓存机制 网络缓存 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]; // 设置标识 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("从网络中下载图片成功!"); } } } // 主线程运行, 进度不断更新方法 @Override protected void onProgressUpdate(Integer... values) { } } 8. 通过BitmapFactory解码(获取)Bitmap的几种方式 **decodeFile()** //从SD卡文件读取 **decodeResource()**//从资源文件res读取 **decodeStream()** //从输入流读取 **decodeByteArray()** //从字节数组读取
资讯
list_item下的 一个图片 下面4个小图片ListView包含不同Item的布局
1. 重写 getViewTypeCount() – 该方法返回多少个不同的布局
2. 重写 getItemViewType(int) – 根据position返回相应的Item
3. 根据view item的类型,在getView中创建正确的convertView城市
和资讯的布局一模一样-
设置(了解)
builder.setTitle("字体设置");
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; } // 将最终选择的状态赋值给初始化状态 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 : 类的实例,隐藏参数,方法不是静态的必须指定
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;//数据大小 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); } }; **权限 Android_UserPerssion_getPakeragerSize;**
获取清理缓存(小妖)
1 遍历getCacheDir下的所有文件,计算每个文件的大小即可
2 清除也是一样,遍历所有文件的大小,删除即可
3 file.length() 返回的是文件的大小(单位b)新闻搜索(时间过长)
1 由于数据过大,应该是服务器那边的, 关键字查询
2 服务器器会返回相关数据给我
3 里面的一些数据, 基本是都是html的形式, 已经排好.评论
1.没什么作用
2.发现起始就是头布局压缩啦! 关于他的topBar-
Android 实现变色状态栏
// 保留状态的位置 <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); // 设置状态栏可用
int color = Color.argb(100, 255, 0, 0);
mTintManager.setTintColor(color); // 设置色彩颜色
}
}
关于(结束)
-
效仿QQ、微信、新浪的圆形头像
- 将原图居中裁剪成正方形
- 根据指定的宽度对正方形进行缩放
- 裁剪成圆形
酒心网###
- 定位
定位方式#
gps一种定位方式
1.wifi定位,IP地址,根据你的IP地址获取你的地理位置,精确度不是特别高了
2.基站定位,基站就是为电话服务,信号的强弱决定了你离基站的距离,精确度比较高,几十米--几公里,精确度取决于基站的个数
wifi定位和基站定位局限性:不能定位海拔
3.gps定位,gps定位卫星进行定位,使用最少卫星实现全球定位,去和
gps定位卫星进行通讯来获取定位坐标,通过光波进行通讯,必须得到
空旷地方才能进行定位,连接至少需要一分钟,耗电,精确度特别高,不
需要联网,联网:agps技术,通过联网来修正获取的坐标,特别准确的
百度定位sdk gps
高德 sdk
定位的具体代码
android.permission.ACCESS_MOCK_LOCATION : 模拟位置的权限,模拟器中必须加的,真机可加可不加
android.permission.ACCESS_FINE_LOCATION : 精确位置的权限,真机必须添加
android.permission.ACCESS_COARSE_LOCATION : 大概位置的权限,真机必须添加
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);//设置是否可以定位海拔,true:可以定位海拔,一定返回gps定位
//criteria : 设置定位的属性,决定使用什么定位方式的
//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{
//当定位位置改变的时候调用
//location : 当前的位置
@Override
public void onLocationChanged(Location location) {
double latitude = location.getLatitude();//获取纬度,平行
double longitude = location.getLongitude();//获取经度
textview.setText("longitude:"+longitude+" latitude:"+latitude);
}
//当定位状态改变的时候调用
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
//当定位可用的时候调用
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
//当定位不可用的时候调用
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
}
4.关闭gps定位
@Override
protected void onDestroy() {
super.onDestroy();
//关闭gps定位,高版本中已经不能这么做了,高版本中规定关闭和开启gps必须交由用户自己去实现
locationManager.removeUpdates(myLocationListener);
}
GPS定位城市需要做两个步骤:
1、取得用户当前位置的经度,纬度。
2、根据经纬度转换成城市名称。
经纬度转换成城市名称,只能使用地图服务了。自己做不来。
地图服务API有两个,一个是百度地图,一个是谷歌地图。百度地图API
调用需要注册百度帐号,并申请APP_KEY,谷歌地图API直接调用即可。
百度地图API调用地址:
http://api.map.baidu.com/geocoder?output=json&location=纬度,经度&key=APP_KEY
QuickSideBar
帮助快速查阅对应分组的侧边栏,可以配合任意列表,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坐标的数组
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.设置动画 //缩放动画 //前四个 : 控制控件由没有变到有 动画 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); //执行动画 contentView.startAnimation(animationSet); 给popuwindow设置背景 popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));