ViewPager
1.PagerAdapter抽象类
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
abstract int |
getCount()
获取适配器中适配数据的个数
| ||||||||||
abstract boolean |
isViewFromObject(
View view,
Object object)
是否复用当前view对象
| ||||||||||
Object |
instantiateItem(
ViewGroup container, int position)
加载指定位置对象用来显示每个条目,会预加载前后两个位置的条目。参数1:就是ViewPager对象;参数2:位置
| ||||||||||
void |
destroyItem(
ViewGroup container, int position,
Object object)
移除指定位置的条目。参数1:就是ViewPager对象;参数2:位置;参数3:就是当前的Item中添加的对象
|
2.ViewPager小知识
2.1 轮播图自动切换下一张的实现方法
(1)建立线程,通过while(true)无限循环,循环体每一次设置ViewPager.setCurrentPager()是下一页即可。通过标记来结束无限循环。
(2)通过handler机制,执行一个延时的任务postDelayed,任务中的逻辑即修改指向当前页索引值的变量指向下一页并且发送一个空消息,然后再在handleMessage()方法中更新ViewPager当前页并且再次执行此延迟的任务,即可无限的循环轮播图。结束任务通过handler的removeCallbacksAndMessages(null)方法,移除Handler中维护的任务
项目相关
1.屏幕适配
记住:效果图设计原则
(1)小图————(按照800x480[5:3]效果图去设计)放到大屏幕手机1280x720[16:9]中会与多少的变形,不过完全看不出来
(2)大图————(平铺满手机的一张图片)单独截取,分别给这两个比例屏幕的手机分别制作一张大图
1.1 图片适配
特点:不同像素密度的手机,加载不同资源文件夹下的图片
注意:如果以下5文件夹某个下没有图片时,对应屏幕的手机加载图片时将会使用更大分辨率文件下的图片
<1>.ldpi————low:320x240屏幕手机加载的图片
<2>.mdpi————middle:480x320屏幕手机加载的图片
<3>.hdpi————high:800x480屏幕手机加载的图片
<4>.xhdpi————xhigh:1280x720屏幕手机加载的图片
<5>.xxhdpi————xxhigh:1920x1080屏幕手机加载的图片
像素密度;每一英寸上面分布像素点的个数
计算样例:5英寸1280x720手机像素密度————Math.sqrt(1280*1280+720*720)/5(单位:dpi ppi)
适配规则:适配不同资源文件夹下的图片是根据手机屏幕像素密度值来确定的,像素密度值根据下表越接近谁就适配哪个资源文件夹的图片
1.2 dimens.xml适配
特点:不同像素密度的手机,加载不同dimens.xml文件
注意:dp能进行完全适配吗?答案是不能,一般在xhdpi手机中不能达到预想效果,所以这里我们需要进行dimens适配
知识点:dp与px的转换公式如下图:计算举例————xhdpi的1dp=2px;ldpi的1dp=0.75px
使用方法:在res目录下创建【values-1280x720】目录,创建demens.xml文件,并且把需要进行demens适配的控件值设置为demens文件索引值,这样既可在不同分辨率下加载不同values目录下的demens.xml文件
1.3 布局layout适配
特点:不同像素密度的手机,加载不同的布局文件)给不同的手机,写一套完全不同的布局
使用方法:在res目录下创建【layout-1280x720】目录,然后再创建相应的布局文件,这样在不同手机分辨率下就会加载相应的布局文件
1.4 Java代码适配
特点:获取屏幕的宽高像素值,然后根据不同屏幕宽高像素的比例,如屏幕宽度的一半这种,分配给控件,来达到屏幕适配效果
1.5 权重适配
特点:剩余空间的分配规则(按照百分比分配空间,类似java代码适配)
2.三种常用项目布局结构
2.1 tabhost+activity(过时)
2.2 fragment数据适配器+RadioGroup
问题:这样设置还有一个错误,显示了一个Fragment,而之前显示的Fragment未消失,两个或者多个Fragment相重叠
解决:在BaseFragment中添加以下方法,该方法将会在FragmentPageAdapter相关方法中被自动调用
2.3 Viewpager+RadioGroups
注意:
<1>.在点击单选按钮时通过setCurrentPager()设置ViewPager当前所在页
<2>.取消ViewPager的预加载和滑动的功能,因为我们不需要滑动并且不能再此页面时加载下一页面的数据来消耗流量
实现:
<1>.设置ViewPager中DEFAULT_OFFSCREEN_PAGES值为0,这样就会取消预加载功能
<2>.设置自定义ViewPager,让其不拦截,不处理即可,就是onInterceptTouchEvent和OnTouchEvent()返回都是false
3.实际开发要点
4.图片的三级缓存
4.1 LruCache<K, V>类
Public Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
LruCache(int maxSize)
参数:LRU算法可操作的最大内存,一般参数值都是运行内存的1/8。构造该对象时必须复写一个sizeOf方法,来告诉系统该减去多大的内存空间 |
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
int |
sizeOf(K key, V value)
protected,计算出存储每条数据的大小。如果是图片的value,可用value.getRowBytes().value.getHeight();计算该图片的大小
| ||||||||||
final V |
put(K key, V value)
存储一个数据到LRU算法维护的内存中
| ||||||||||
final V |
get(K key)
获取LRU算法中维护的一个数据
|
4.2 Executors类
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
static ExecutorService |
newFixedThreadPool(int nThreads)
初始化线程池,并且线程池中可用线程的个数,并且线程个数计算公式是(2*cpu数+1)
|
4.3 ExecutorService接口
5.AsyncTask<Params, Progress, Result>抽象类
作用:异步任务,可以把需要异步执行的任务逻辑定义在该类中
Protected Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void |
onPreExecute()
protected.请求网络,耗时操作的预备方法,可以把初始化进度条的操作定义在该方法中。在主线程中运行
| ||||||||||
abstract Result |
doInBackground(Params... params)
protected.耗时操作,请求网络或者访问数据库。此方法参数类型是第一个泛型的类型,返回值类型是第三个泛型的类型。在子线程中执行
| ||||||||||
void |
onPostExecute(Result result)
protected.耗时操作以后调用的方法,该方法的参数就是接受的doInBackground()方法的返回值。此方法参数类型是第三个泛型的类型。在主线程中执行。 | ||||||||||
static void |
execute(
Runnable runnable)
把异步任务所需参数传入该对象中
|
6.新闻项目知识点
(1)内容页和菜单页布局不写死,而预设成一个FrameLayout布局的原因是考虑到项目的扩展性,只是起到占位的作用,可以以后随意添加任意Fragment来替换
(2)考虑到每个页面都有界面展示效果并且都需要向网络获取数据,所以定义一个initView和initData方法,并且定义一个页面的基类
(3)因为取消了预加载功能,所以应该在每一个Pager的滑动监听事件中请求网络加载数据,就是当页被选中时调用initData()方法
(4)自定义加强ViewPager虽然复写了dispatchTouchEvent()方法,可以返回值依然是super.dispatchTouchEvent(ev),所以只是进行了加强,没有修改底层事件传递的机制,所以事件可以传递到最里面的ImageView控件
(5)点中轮播图时,要停止轮播图的自动滚动;抬起和cancel时要再次开启轮播图的滚动;cancel中开启的原因是因为轮播图切换图片会达到cancel状态,而没有抬起事件
(6)为了不让图片不失帧并且显示完全,应该测量自定义控件图片的大小,然后按照比例显示
项目相关框架
1.侧滑栏SlidingMenu
1.1 SlidingFragmentActivity类
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void |
setBehindContentView(int resourseId)
预设Sliding侧拉栏的布局文件
| ||||||||||
void |
setBehindContentView(View view)
从ProgressBar继承的方法,获取进度的最大值 | ||||||||||
SlidingMenu |
getSlidingMenu()
获取侧拉栏对象 |
1.2 SlidingMenu类
2.常用工具集xUtils
2.1 HttpUtils类
2.2 RequestParams类
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void |
addBodyParameter(String name,String value)
添加一个请求参数。参数1:参数name;参数2:参数值
| ||||||||||
void |
addBodyParameter(List<NameValuePair> nameValuePairs)
添加多个请求参数
|
2.3 RequestCallBack抽象类
2.4 ViewUtils类
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
static void |
inject(Object handler, View view)
注解关联此对象中的View布局
| ||||||||||
static void |
inject(Activity activity)
注解关联一个Activity对象,将自动关联其对应的布局文件
|
2.5 BitmapUtils类
注:其中维护了三级缓存的机制
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void |
display(ImageView container, String uri)
从uri获取图片,并且显示在指定container控件上
|
3.Json解析框架Gson
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
T |
fromJson(String json, Class<T> classOfT)
解析json数据,返回对应的JavaBean对象。参数1:目标需解析的Json串;参数2:JavaBean对象的字节码文件对象
注意:JavaBean对象中建立原则:数组元素建立集合;对象元素就建立成一个对象;变量名必须与json中的名称相同
|