【控件】banner图片自动轮换—从服务端请求图片,动态改变图片个数

来源:互联网 发布:windows激活有什么用 编辑:程序博客网 时间:2024/06/01 12:24

序:这是很长时间以来第一次写博客来记录自己的学习,向来没有记笔记的习惯,进步都是从改变开始的。

正文:直接上代码吧,过程看注释。使用到的jar有,volley和org.json。

 源码下载地址:http://download.csdn.net/download/u011087665/7663447

三个主文件

package tk.dalii.banner.activitys;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import tk.dalii.banner.R;import tk.dalii.banner.utils.OtherUtil;import tk.dalii.banner.weigets.BitmapCache;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.Request.Method;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.JsonObjectRequest;import com.android.volley.toolbox.NetworkImageView;import com.android.volley.toolbox.Volley;import android.support.v7.app.ActionBarActivity;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.annotation.SuppressLint;import android.os.Bundle;import android.os.Handler;import android.os.Parcelable;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;import android.widget.ImageView.ScaleType;import android.widget.LinearLayout.LayoutParams;/** * 主activity * @author zhi * */@SuppressLint("HandlerLeak")public class MainActivity extends ActionBarActivity {/** * 请求队列 */private RequestQueue queue;/** * android-support-v4中的滑动组件 */private ViewPager viewPager;/** * 滑动的图片集合 */private List<ImageView> imageViews;/** * 图片标题 */private String[] titles;/** * dots线性布局 */private LinearLayout ll_main_dots;/** * 图片标题正文的那些点 */private List<View> dots;/** * 显示title的TextView */private TextView tv_title;/** * 当前图片的索引号 */private int currentItem = 0;/** * 它可安排在给定延迟后运行命令的ExecutorService的, 或者定期地执行。 */private ScheduledExecutorService scheduledExecutorService;/** * 请求图片的URL */private final static String REQUEST_IMGS_URL = "http://192.168.10.72:8091/index.php/Api/getNewArticle";/** * 切换当前显示的图片 */private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {// 切换当前显示的图片viewPager.setCurrentItem(currentItem);};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 请求图片jsonrequestImgJson();}/** * 请求新闻图片json */private void requestImgJson() {queue = Volley.newRequestQueue(this);JsonObjectRequest jsonObjRequest = new JsonObjectRequest(Method.POST,REQUEST_IMGS_URL, null, new Response.Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject response) {// 设置新闻图片setBanner(response.toString());Log.d("info", response.toString());}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.e("error", error.getMessage(), error);Toast.makeText(MainActivity.this, "请求出错!",Toast.LENGTH_SHORT).show();}});queue.add(jsonObjRequest);}/** * 设置banner String json = * "{'imgPath':'http://dalii.sinaapp.com/imgs/','fileInfos':[{'img':'18.jpg','id':'33','title':'文章title'}]}" * ; *  * @param json */private void setBanner(String json) {try {JSONObject jsonObj = new JSONObject(json);String imgPath = jsonObj.getString("imgPath");JSONArray jsonArr = jsonObj.getJSONArray("fileInfos");// 初始化图片资源imageViews = new ArrayList<ImageView>();titles = new String[jsonArr.length()];dots = new ArrayList<View>();ll_main_dots = (LinearLayout) findViewById(R.id.ll_main_dots);LayoutParams lp = new LayoutParams(OtherUtil.Dp2Px(this, 5),OtherUtil.Dp2Px(this, 5));lp.setMargins(OtherUtil.Dp2Px(this, 1.5f), 0,OtherUtil.Dp2Px(this, 1.5f), 0);ImageLoader imageLoader = new ImageLoader(queue,BitmapCache.getInstace());for (int i = 0; i < jsonArr.length(); i++) {JSONObject fileInfo = jsonArr.getJSONObject(i);String imgUrl = imgPath + fileInfo.getString("img");// 文章idString id = fileInfo.getString("id");// 图片NetworkImageView networkImageView = new NetworkImageView(this);networkImageView.setDefaultImageResId(R.drawable.defaultimg);networkImageView.setErrorImageResId(R.drawable.errorimg);networkImageView.setImageUrl(imgUrl, imageLoader);networkImageView.setScaleType(ScaleType.CENTER_CROP);networkImageView.setTag(id);imageViews.add(networkImageView);// titletitles[i] = fileInfo.getString("title");// dotView v = LayoutInflater.from(this).inflate(R.layout.dot_item,null);v.setLayoutParams(lp);dots.add(v);ll_main_dots.addView(v);}} catch (JSONException e) {e.printStackTrace();}tv_title = (TextView) findViewById(R.id.tv_title);tv_title.setText(titles[0]);dots.get(0).setBackgroundResource(R.drawable.dot_focused);viewPager = (ViewPager) findViewById(R.id.vp_banner);// 设置填充ViewPager页面的适配器viewPager.setAdapter(new MyAdapter());// 设置一个监听器,当ViewPager中的页面改变时调用viewPager.setOnPageChangeListener(new MyPageChangeListener());}/** * 填充ViewPager页面的适配器 *  * @author Administrator *  */private class MyAdapter extends PagerAdapter {@Overridepublic int getCount() {return imageViews.size();}@Overridepublic Object instantiateItem(View arg0, int arg1) {((ViewPager) arg0).addView(imageViews.get(arg1));imageViews.get(arg1).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString id = (String) v.getTag();Toast.makeText(MainActivity.this, "文章Id:[" + id,Toast.LENGTH_SHORT).show();}});return imageViews.get(arg1);}@Overridepublic void destroyItem(View arg0, int arg1, Object arg2) {((ViewPager) arg0).removeView((View) arg2);}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {}@Overridepublic Parcelable saveState() {return null;}@Overridepublic void startUpdate(View arg0) {}@Overridepublic void finishUpdate(View arg0) {}}/** * 当ViewPager中页面的状态发生改变时调用 *  * @author Administrator *  */private class MyPageChangeListener implements OnPageChangeListener {private int oldPosition = 0;/** * This method will be invoked when a new page becomes selected. * position: Position index of the new selected page. */public void onPageSelected(int position) {currentItem = position;tv_title.setText(titles[position]);dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);dots.get(position).setBackgroundResource(R.drawable.dot_focused);oldPosition = position;}public void onPageScrollStateChanged(int arg0) {}public void onPageScrolled(int arg0, float arg1, int arg2) {}}/** * 换行切换任务 * @author zhi * */private class ScrollTask implements Runnable {public void run() {synchronized (viewPager) {// System.out.println("currentItem: " + currentItem);currentItem = (currentItem + 1) % imageViews.size();handler.obtainMessage().sendToTarget(); // 通过Handler切换图片}}}@Overrideprotected void onStart() {scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();// 当Activity显示出来后,每两秒钟切换一次图片显示scheduledExecutorService.scheduleAtFixedRate(new ScrollTask(), 2, 3,TimeUnit.SECONDS);super.onStart();}@Overrideprotected void onStop() {// 当Activity不可见的时候停止切换scheduledExecutorService.shutdown();super.onStop();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}}</strong>


BitmapCache.java

<strong>package tk.dalii.banner.weigets;import android.graphics.Bitmap;import android.support.v4.util.LruCache;import com.android.volley.toolbox.ImageLoader.ImageCache;/** * 将缓存图片的大小设置为5M * @author zhi * */public class BitmapCache implements ImageCache {/** * BitmapCache实例变量 */private static BitmapCache mBitmapCache;/** * LruCache缓存 */private LruCache<String, Bitmap> mCache;        private BitmapCache() {          int maxSize = 5 * 1024 * 1024;          mCache = new LruCache<String, Bitmap>(maxSize) {              @Override              protected int sizeOf(String key, Bitmap bitmap) {                  return bitmap.getRowBytes() * bitmap.getHeight();              }          };      }    /**     * 单例获取实例     * @return     */    public static BitmapCache getInstace() {if (mBitmapCache == null) {mBitmapCache = new BitmapCache();}return mBitmapCache;}    @Override      public Bitmap getBitmap(String url) {          return mCache.get(url);      }        @Override      public void putBitmap(String url, Bitmap bitmap) {          mCache.put(url, bitmap);      }  }</strong>

OtherUtil.java

<strong>package tk.dalii.banner.utils;import android.content.Context;/** * 工具类 * @author zhi * */public class OtherUtil {/** *  * dp转换为px *  * @param context * @param dp * @return */public static int Dp2Px(Context context, float dp) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dp * scale + 0.5f);}/** * px转换为dp *  * @param context * @param px * @return */public static int Px2Dp(Context context, float px) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (px / scale + 0.5f);}}</strong>

 源码下载地址:http://download.csdn.net/download/u011087665/7663447



0 0
原创粉丝点击