Android:ViewPager扩展的具体解释——导航ViewPagerIndicator(有图片缓存,异步加载图片)
我们已经用viewpager该。 github那里viewpager扩展,导航风格更丰富。这个开源项目ViewPagerIndicator。非常好用,但样品是比较简单,实际用起来是非常不延长。例如,在fragment里进行图片缓存和图片异步载入。
以下是ViewPagerIndicator源代码执行后的效果。大家也都看过了,我多此一举截几张图。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
===========================================华丽的切割线========================================
以下是我改装过的,可异步载入图片,可图片缓存:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
看到美女你心动了没有呢?
package com.example.viewpagerindicatortest; import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import com.viewpagerindicator.TabPageIndicator; /**
* 基于Fragment的Tab样式的viewpager;
*
* @author andy
*
* 很多其它详情请訪问博客:http://blog.csdn.net/lyc66666666666
*/
public class SampleTabsDefault extends FragmentActivity { //tab标题
private static final String[] CONTENT = new String[] { "Recent", "Artists", "Albums", "Songs", "Playlists", "Genres" ,"test"}; private List<SubFragment> list = new ArrayList<SubFragment>(); String[] urls = new String[] { "http://a.hiphotos.baidu.com/image/pic/item/3bf33a87e950352ad6465dad5143fbf2b2118b6b.jpg",
"http://a.hiphotos.baidu.com/image/pic/item/c8177f3e6709c93d002077529d3df8dcd0005440.jpg",
"http://f.hiphotos.baidu.com/image/pic/item/7aec54e736d12f2ecc3d90f84dc2d56285356869.jpg",
"http://e.hiphotos.baidu.com/image/pic/item/9c16fdfaaf51f3de308a87fc96eef01f3a297969.jpg",
"http://d.hiphotos.baidu.com/image/pic/item/f31fbe096b63f624b88f7e8e8544ebf81b4ca369.jpg",
"http://h.hiphotos.baidu.com/image/pic/item/11385343fbf2b2117c2dc3c3c88065380cd78e38.jpg",
"http://c.hiphotos.baidu.com/image/pic/item/3801213fb80e7bec5ed8456c2d2eb9389b506b38.jpg" }; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_tabs); /*
* 初始化:组装多个fragment
* 第一次创建subfragment不会运行onCreateView方法
*/
for (int i = 0; i < 7; i++) { SubFragment fragment =new SubFragment(urls[i]);
list.add(fragment);
} ViewPager pager = (ViewPager)findViewById(R.id.pager);
pager.setAdapter(new MyAdapter(getSupportFragmentManager(),list));//设置适配器 TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
indicator.setViewPager(pager);// } /**
* FragmentPagerAdapter用来适配Fragment
*/
class MyAdapter extends FragmentPagerAdapter { List<SubFragment> mList; public MyAdapter(FragmentManager fm,List<SubFragment> list) {
super(fm);
mList = list;
} /**
* FragmentPagerAdapter初始化item的时候会调用一次getItem。
* 而第二次返回item则不调用getItem方法,而是运行SubFragment的onCreateView方法。
* 也就是说仅仅有在与fragment关联的时候会调用一次getItem,以后则不调用;
*/
@Override
public Fragment getItem(int position) { return mList.get(position); } /*
* 返回title
*/
@Override
public CharSequence getPageTitle(int position) {
return CONTENT[position % CONTENT.length].toUpperCase();
} /*
* 返回总页数
*/
@Override
public int getCount() {
return mList.size();
} } }
package com.example.viewpagerindicatortest; import java.io.IOException;
import java.lang.ref.SoftReference; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames; import android.annotation.SuppressLint;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView; /**
* 基于Fragment的Tab样式的viewpager;
*
* @author andy
*
* 很多其它详情请訪问博客:http://blog.csdn.net/lyc66666666666
*/
@SuppressLint("ValidFragment")
public class SubFragment extends Fragment { private static final String KEY_CONTENT = "TestFragment:Content"; private String mContent = "? ?? "; private String url; public SubFragment(String url) { this.url = url;
System.out.println("url:"+url); }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) {
mContent = savedInstanceState.getString(KEY_CONTENT);
}
} View v ; /**
* 每次翻页都会调用onCreateView创建一次组件
*/
@Override
public View onCreateView(LayoutInflater inflater,
final ViewGroup container, Bundle savedInstanceState) { v = inflater.inflate(R.layout.test, null); new AsyncImageLoader().loadDrawable(url, new ImageCallback() { @SuppressLint("NewApi")
public void imageLoaded(Drawable imageDrawable, String imageUrl) {
System.out.println("图片获取完毕"); ImageView image = (ImageView) v.findViewById(R.id.img);
image.setBackground(imageDrawable); }
}); return v;
} /**
* 定义回调接口
*/
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable, String imageUrl);
} /**
* 异步载入图片
*/
static class AsyncImageLoader { Global global; public AsyncImageLoader() {
global = Global.getInstance();
} /**
* 创建子线程载入图片
* 子线程载入完图片交给handler处理(子线程不能更新ui,而handler处在主线程,能够更新ui)
* handler又交给imageCallback,imageCallback需要自己来实现。在这里能够对回调參数进行处理
*
* @param imageUrl :需要载入的图片url
* @param imageCallback:
* @return
*/
public Drawable loadDrawable(final String imageUrl,
final ImageCallback imageCallback) { //假设缓存中存在图片 ,则首先使用缓存
if (global.getCache(imageUrl)!=null) {
System.out.println("存在缓存~~~~~~~~~~~~~~~~~");
SoftReference<Drawable> softReference = global.getCache(imageUrl);
Drawable drawable = softReference.get();
if (drawable != null) {
imageCallback.imageLoaded(drawable, imageUrl);//运行回调
return drawable;
}
} /**
* 在主线程里运行回调。更新视图
*/
final Handler handler = new Handler() {
public void handleMessage(Message message) {
imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
}
}; /**
* 创建子线程訪问网络并载入图片 ,把结果交给handler处理
*/
new Thread() {
@Override
public void run() {
Drawable drawable = loadImageFromUrl(imageUrl);
// 下载完的图片放到缓存里
global.setCache(imageUrl, new SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
}
}.start(); return null;
} /**
* 下载图片 (注意HttpClient 和httpUrlConnection的差别)
*/
public Drawable loadImageFromUrl(String url) { try {
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000*15);
HttpGet get = new HttpGet(url);
HttpResponse response; response = client.execute(get);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity(); Drawable d = Drawable.createFromStream(entity.getContent(),
"src"); return d;
} else {
return null;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return null;
} } @Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_CONTENT, mContent);
} }
package com.example.viewpagerindicatortest; import java.lang.ref.SoftReference;
import java.util.HashMap; import android.graphics.drawable.Drawable; /**
* 全局变量。以软引用方式存放图片缓存
*
* @author andy
*
* 很多其它详情请訪问博客:http://blog.csdn.net/lyc66666666666
*/
public class Global { // 软引用,使用内存做暂时缓存 (程序退出,或内存不够则清除软引用)
private static HashMap<String, SoftReference<Drawable>> imageCache; private static Global global; public static Global getInstance() { if (global == null) {
global = new Global();
} if (imageCache == null) {
imageCache = new HashMap<String, SoftReference<Drawable>>();
} return global; } //存放缓存
public void setCache(String url, SoftReference<Drawable> softReference) { imageCache.put(url, softReference); } //获取缓存
public SoftReference<Drawable> getCache(String url) { return imageCache.get(url); } //清除缓存
public void clearCache() {
if (imageCache.size() > 0) {
imageCache.clear();
}
} }
simple_tabs.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 Jake Wharton Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--> <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"> <com.viewpagerindicator.TabPageIndicator
android:id="@+id/indicator"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
/>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
/> </LinearLayout>
test.xml
<? xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <ImageView
android:id="@+id/img"
android:layout_width="fill_parent"
android:layout_height="fill_parent" /> </LinearLayout>
AndroidMainfest.xml
<?xml version="1.0" encoding="utf-8"? >
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.viewpagerindicatortest"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET"/> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" > <activity
android:name=".SampleTabsDefault"
android:label="@string/app_name"
android:theme="@style/Theme.PageIndicatorDefaults">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
版权声明:本文博主原创文章,博客,未经同意不得转载。
Android:ViewPager扩展的具体解释——导航ViewPagerIndicator(有图片缓存,异步加载图片)的更多相关文章
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
Android 高手进阶(21) 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...
- Android学习笔记(二)之异步加载图片
最近在android开发中碰到比较棘手的问题,就是加载图片内存溢出.我开发的是一个新闻应用,应用中用到大量的图片,一个界面中可能会有上百张图片.开发android应用的朋友可能或多或少碰到加载图片内存 ...
- Android之ListView异步加载图片且仅显示可见子项中的图片
折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...
- Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...
- 【Android】纯代码创建页面布局(含异步加载图片)
开发环境:macOS 10.12 + Android Studio 2.2,MinSDK Android 5.1 先看看总体效果 本示例是基于Fragment进行的,直接上代码: [界面结构] 在 F ...
- 实例演示Android异步加载图片
本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...
- 实例演示Android异步加载图片(转)
本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...
- [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html 这个可以实现ImageView异步加载 ...
- Android之使用Android-AQuery异步加载图片(一)
第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...
随机推荐
- poj2528(线段树)
题目连接:http://poj.org/problem?id=2528 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 分析:离散化+线段树,这题因为每个数字其实表示的是一个单位长度,因 ...
- auto_ptr and scoped_ptr
#include "boost/scoped_ptr.hpp" #include <iostream> #include <memory>//contain ...
- openfire插件开发的几点说明
1.关于插件的目录结构 这个网上的资料很多,但是我觉得要看懂也不太容易,我这里上一个包括了jsp和servlet的图,希望大家能马上看懂: ME的Navigator视图下的截图: build path ...
- java 常用的包 默认导入的包
1.java.lang----包含一些Java语言的核心类,如String.Math.Integer.System和Thread,提供常用功能. 2.java.awt----包含了构成抽象窗口工具集( ...
- windows phone 页面导航(6)
原文:windows phone 页面导航(6) 页面导航的例子我们使用的是两个页面,从第一个页面(MainPage)导航到第二个页面(SecondPage),然后可以从第二个页面导航到第一个页面 , ...
- 【Unity Shaders】使用Unity Render Textures实现画面特效——画面特效中的亮度、饱和度和对照度
本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...
- Locked ownable synchronizers(转)
public class DeadLock { public static void main(final String[] args) throws Exception { final Object ...
- Python学习路径8——Python对象2
1.标准型运营商 1.1对象值对照 比较运算符用于如果相同类型的对象是相等.所有的内建类型的是在比较操作中支持,返回布尔比较操作值True 或 False. <span style=" ...
- JAVA 数据权限设计
数据权限设计 前言 在各种系统中.要保证数据对象的安全性以及易操作性,使企业的各业务部门.职能部门可以方便并且高效的协同工作,那么一个好的数据权限管理设计就成为一个关键的问题.尽管企业中各个单元的工作 ...
- Mysql 当安装完成后不执行 mysql 和 performance_schema 数据库
Mysql问题 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) Mysql ...