首先来分析布局结构吧
外面是个
FrameLayout 因为文字需要覆盖在image上面
接下来就是引入
android.support.v4.view.ViewPager
下面的文字和点用线性布局
main_layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<FrameLayout
android:id="@+id/fl"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="190dp"/>
<LinearLayout
android:layout_marginTop="145dp"
android:gravity="center_vertical"
android:background="#66000000"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="45dp">
<TextView
android:id="@+id/title"
android:text="abcdefg ,hijklmn,opqrdt"
android:textColor="#ffffff"
android:maxLines="2"
android:ellipsize="end"
android:lineSpacingMultiplier="1.2"
android:gravity="center_vertical"
android:layout_marginLeft="5dp"
android:layout_weight="5"
android:layout_width="0dp"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/dot_ll"
android:layout_weight="3"
android:orientation="horizontal"
android:gravity="end|bottom"
android:padding="9dp"
android:layout_width="0dp"
android:layout_height="match_parent">
</LinearLayout>
</LinearLayout>
</FrameLayout>
<ImageView
android:layout_below="@id/fl"
android:id="@+id/iv"
android:scaleType="center"
android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</RelativeLayout>
对了还有个点样式
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="#ffffff"/>
<corners android:radius="6dp"/>
</shape>
shape 形状
solid 线的 颜色
corners 半径
GSON 顺便提一下
比如json字符串为:[{"name":"name0","age":0}]
代码:
Person person = gson.fromJson(str, Person.class);
提供两个参数,分别是json字符串以及需要转换对象的类型。
第二种,转换成列表类型:
代码:
List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());
for(int i =0; i < ps.size() ; i++)
{
Person p = ps.get(i);
System.out.println(p.toString());
}
那么开始步入主题了
分析
实现滑动用到适配器pageradapter
实现定时切换 可以用到handler定时发送消息 和timer定时器,等,这里我们就用handler
还有一点,就是当滑到第一个还要向左滑动,让它切换到到最后一个,如何处理?同理最后 一个pager
这里加载网络就用volley吧,为了方便因为这不是我们的重点
好了,上代码
public class MainActivity extends Activity {
private static final String url = "http://news-at.zhihu.com/api/4/news/latest";
private static final int MSG = 0x10 ;
private static final int MSG_SCROLL = 1;
private static final int Defalut_postion= 100;
private static final int isError = 10000;
private boolean isScroll = true ;
private BannerAdapter bannerAdapter;
protected int mBannerPosition = 0;
private ImageView [] imgs;
private TextView tv_title;
private ViewPager pager;
private LinearLayout ll_dots;
public ImageLoader imageLoader = ImageLoader.getInstance();
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Added in the code by me for handling the init error
imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseContext()));
return true;
}
private Handler handler = new Handler(){
private ItemText infoBean;
private List<Story> storyList;
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if (msg.what == MSG) {
infoBean = (ItemText) msg.obj;
storyList = infoBean.stories;
if(storyList.size() > 0 && storyList != null){
initAfterView(storyList);
}else{
tv_title.setText("郁闷。。网络有问题");
}
}
if (msg.what == MSG_SCROLL) {
Log.i("mBannerPosition","位置="+mBannerPosition);
if(isScroll){
int max = infoBean.stories.size();
Log.i("max","位置="+max);
int position = (mBannerPosition + 1) % Defalut_postion;
if (position == max) { // 最后一页时回到第一页
pager.setCurrentItem(0, false);
}else{
Log.i("cuurrent","位置="+position);
pager.setCurrentItem(position);
}
if(storyList != null || storyList.size() == 0){
setTitle(storyList);
}else{
tv_title.setText("郁闷。。网络有问题");
}
handler.removeMessages(MSG_SCROLL);
handler.sendEmptyMessageDelayed(MSG_SCROLL, 2000);
}
}
if(msg.what == isError){
tv_title.setText("郁闷。。网络有问题");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView iv = (ImageView) findViewById(R.id.iv);
BitmapUtils mBitmapUtils = new BitmapUtils(this);
//mBitmapUtils.display(iv, "http://pic1.zhimg.com//6387f9f8cafb0719c15067a7f5659474.jpg");
init();
}
private void init() {
// TODO Auto-generated method stub
initView();
initData();
handler.sendEmptyMessageDelayed(MSG_SCROLL, 2000);
initEvent();
}
private void initEvent() {
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mBannerPosition = position;
setIndicator(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
pager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
if(arg1.getAction() == MotionEvent.ACTION_UP){
isScroll = true ;
handler.sendEmptyMessageDelayed(MSG_SCROLL, 2000);
}else {
isScroll = false ;
}
return false;
}
});
}
protected void setTitle2(int position) {
// TODO Auto-generated method stub
}
protected void setIndicator(int position) {
// TODO Auto-generated method stub
for (ImageView img : imgs) {
img.setBackgroundResource(R.drawable.dot_normal);
}
imgs[position].setBackgroundResource(R.drawable.dot_focused);
}
private void initView() {
pager = (ViewPager) findViewById(R.id.view_pager);
ll_dots = (LinearLayout) findViewById(R.id.dot_ll);
tv_title = (TextView) findViewById(R.id.title);
}
private void initDotas(List<Story> storyList) {
imgs = new ImageView[storyList.size()];
// TODO Auto-generated method stub
for (int i = 0; i < storyList.size(); i++) {
ImageView img = new ImageView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(6,6);
params.rightMargin = 8;
img.setLayoutParams(params);
img.setBackgroundResource(R.drawable.dot_normal);
ll_dots.addView(img, params);
imgs[i] = img;
}
}
// return jsonstr.substring(jsonstr.indexOf("{")).replace("\r\n","\n");
private void initData() {
Volley volley = new Volley();
RequestQueue queue = volley.newRequestQueue(this);
// TODO Auto-generated method stub
StringRequest request = new StringRequest(Request.Method.GET ,url, new Listener<String>() {
private String str;
@Override
public void onResponse(String response) {
try {
byte[] bytes = response.getBytes();
str = new String(bytes, "gb2312");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(str != null){
ItemText infoBean = new Gson().fromJson(str,ItemText.class );
Log.i("response", response);
Message message = new Message();
message.obj = infoBean;
message.what = MSG;
handler.sendMessage(message);
}else{
Message message = new Message();
message.what = isError;
handler.sendMessage(message);
}
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
});
queue.add(request);
}
private void initAfterView(List<Story> storyList) {
bannerAdapter = new BannerAdapter(this ,storyList);
pager.setAdapter(bannerAdapter);
initDotas(storyList);
setTitle(storyList);
}
private void setTitle(List<Story> storyList) {
tv_title.setText(""+check(storyList.get(mBannerPosition).title));
Log.i("mBannerPositionsetTitle==", "=="+mBannerPosition);
Log.i("storyList.get(mBannerPosition).title", "=="+storyList.get(mBannerPosition).title);
}
private String check(String title) {
// TODO Auto-generated method stub
if(title == null)
return "";
else
return title;
}
}
adapter
public class BannerAdapter extends PagerAdapter {
private List<Story> bannerLsit;
private Context mContext ;
private BitmapUtils mBitmapUtils;
public BannerAdapter(Context mContext ,List<Story> storyList){
this.mContext = mContext;
this.bannerLsit = storyList;
mBitmapUtils = new BitmapUtils(mContext);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return bannerLsit != null ? bannerLsit.size() : 0;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg1 == arg0;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView((View) object);
}
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return POSITION_NONE;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
View view = LayoutInflater.from(mContext).inflate(R.layout.item, container, false);
ImageView iv = (ImageView) view.findViewById(R.id.image);
String abc = bannerLsit.get(position).images.get(0);
mBitmapUtils.display(iv,bannerLsit.get(position).images.get(0));
container.addView(view);
return view;
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
// TODO Auto-generated method stub
super.unregisterDataSetObserver(observer);
}
@Override
public void notifyDataSetChanged() {
// TODO Auto-generated method stub
super.notifyDataSetChanged();
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
// TODO Auto-generated method stub
super.registerDataSetObserver(observer);
}
@Override
public void finishUpdate(ViewGroup container) {
// TODO Auto-generated method stub
super.finishUpdate(container);
}
}