在fragment中用ViewFlipper做网络图片轮播手动+自动+点击事件

本文主要是介绍在fragment中用ViewFlipper做网络图片轮播手动+自动+点击事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人刚步入大三,从大二开始自学Android,已经学了一年了,所以我还是个小菜,希望老鸟们勿喷。本博客分享个人开发经验,用于互相交流学习。

由于项目中需要用到图片轮播所以花了一天的时间把它弄了出来,我也是第一次来做,数据缓存还没有做,如有更好的方法请与我分享。(1021766585@qq.com)
先需求分析一下

分析
UI主线程中初始化ViewFlipper
我是在fragment来做的底部导航,所以我的ViewFlipper在fragment中。

public class FragmentHome extends Fragment {private ViewFlipper flipper;private GridView gridView;private List<Map<String, Object>> dataList;private SimpleAdapter sim_adapter;private String url="http://******/microclass/index.php?g=service&m=index&a=index";private Handler handler = new Handler();@Override@Nullablepublic View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {// TODO Auto-generated method stubView view = inflater.inflate(R.layout.fragment_home,container,false);flipper = (ViewFlipper) view.findViewById(R.id.viewFlipper);new ThreadGetHomeImages(url, handler, flipper, getActivity()).start();return view;}

将接口的URL传递给网络线程获取所有的JSON数据(由于一些安全性问题,不方便将JSON数据完全分享出来)

{"flag":"Success","msg":"\u9996\u9875\u6eda\u52a8\u56fe\u7247","data":[{"slide_name":"\u4e60\u5927\u5927\u7684\u8868\u60c5\u8bf4\u660e\u4e86\u4e00\u5207\uff01","slide_pic":"http:\/\/**********\/microclass\/data\/upload\/20160916\/57dbdacb2e1ff.jpg","slide_url":"http:\/\/**********\/microclass\/index.php?g=&m=article&a=index&id=27"},{"slide_name":"\u5fae\u8bfb\u4e66\uff01","slide_pic":"http:\/\/******\/microclass\/data\/upload\/20160916\/57dbb7cdbc81b.jpg","slide_url":"http:\/\/*******\/microclass\/index.php?g=portal&m=article&a=index&id=26"},{"slide_name":"\u61a7\u61ac\u7684\u7ae5\u5e74","slide_pic":"http:\/\/**********\/microclass\/data\/upload\/20160916\/57dbd6de2036c.jpg","slide_url":"http:\/\/********\/microclass\/index.php?g=portal&m=article&a=index&id=28"}]}
public class ThreadGetHomeImages extends Thread {private String url,str,imageUrl;private ViewFlipper flipper;private List<ImageView> imageViews = new ArrayList<ImageView>();private List<CarouselImage> data;//方便数据的写入和读取private ImageView temp;private Handler handler;private Context context;private TranslateAnimation rightInAnim,leftOutAnim,rightOutAnim,leftInAnim;private float startX;private HttpClient client;public ThreadGetHomeImages(String url,Handler handler,ViewFlipper flipper,Context context) {// TODO Auto-generated constructor stubthis.url = url;this.handler = handler;this.flipper = flipper;this.context = context;}@Overridepublic void run() {// TODO Auto-generated method stubtry {client = new DefaultHttpClient();HttpGet request = new HttpGet(); //用GET方法request.setURI(new URI(url));//设置URLHttpResponse response = client.execute(request);//发送请求返回响应HttpEntity entity = response.getEntity();//获得网页内容实体if(entity != null){str = EntityUtils.toString(entity);//如果不为空就转换成字符串类型Log.i("Json", str);data = parseJson(str);//对获取到的JSON字符串进行解析赋值给List<CarouselImage> datafor(int i = 0; i<data.size();i++){//通过循环将图片的URL数据读取出来imageUrl = data.get(i).getImageUrl();Log.i("ImageUrl", imageUrl+"");temp = new ImageView(context);temp.setImageBitmap(getBitmap(imageUrl));//getbitmap方法获取网络图片temp.setScaleType(ScaleType.CENTER_CROP);//控制图片的显示imageViews.add(temp);//添加到ImageView集合中}}} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (URISyntaxException e) {// TODO Auto-generated catch blocke.printStackTrace();}handler.post(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubsetVeiwFlipperAnim();//在主线程中更新UI}});super.run();}private List<CarouselImage> parseJson(String json) {List<CarouselImage> items = new ArrayList<CarouselImage>();//new一个CarouselImage集合try {JSONObject object = new JSONObject(json);String state = object.getString("flag");if(state.equals("Success")){JSONArray ImagesData = object.getJSONArray("data");for(int i = 0;i<ImagesData.length();i++){CarouselImage image = new CarouselImage();  JSONObject item = ImagesData.getJSONObject(i);image.setImageName(item.getString("slide_name"));image.setImageUrl(item.getString("slide_pic"));image.setTextUrl(item.getString("slide_url"));Log.i("ImageUrl", item.getString("slide_pic"));items.add(image);}return items;}else{Log.i("STATE", "数据获取失败!!");}} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public static Bitmap getBitmap(String imageUri) {Log.v("ImageUrl", "getbitmap:" + imageUri);// 显示网络上的图片Bitmap bitmap = null;try {URL myFileUrl = new URL(imageUri);HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();conn.setDoInput(true);conn.connect();InputStream is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);is.close();Log.v("download finished", "image download finished." + imageUri);} catch (OutOfMemoryError e) {e.printStackTrace();bitmap = null;} catch (IOException e) {e.printStackTrace();Log.v("getbitmap", "getbitmap bmp fail---");bitmap = null;}return bitmap;}private void setVeiwFlipperAnim() {for(int i =0;i<imageViews.size();i++){flipper.addView(imageViews.get(i));//将之前做好的ImageView集合中的元素逐一添加添加到ViewFlipper中}//设置ViewFlipper的滑动行为的动画// 图片从右侧滑入rightInAnim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 1.0f,Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.0f);rightInAnim.setDuration(1000);// 图片从左侧滑出leftOutAnim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, -1.0f,Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.0f);leftOutAnim.setDuration(1000);// 图片从右侧滑出rightOutAnim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 1.0f,Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.0f);rightOutAnim.setDuration(1000);// 图片从左侧滑入leftInAnim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -1.0f,Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.0f);leftInAnim.setDuration(1000);// 正常情况左侧划出,右侧滑入flipper.setOutAnimation(leftOutAnim);flipper.setInAnimation(rightInAnim);flipper.setFlipInterval(5000);//设置自动切换时间flipper.startFlipping();flipper.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubint action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN:startX = (int) event.getX();//flipper.stopFlipping();// 当手指按下时,停止图片的循环播放。并记录当前x坐标Log.i("count", flipper.getDisplayedChild()+"");break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:if (event.getX() - startX > 100) { // 手指向右滑动,左侧滑入,右侧滑出flipper.setInAnimation(leftInAnim);flipper.setOutAnimation(rightOutAnim);flipper.showPrevious();flipper.startFlipping();} else if (startX - event.getX() > 100) {// 手指向左滑动,右侧滑入,左侧滑出flipper.setInAnimation(rightInAnim);flipper.setOutAnimation(leftOutAnim);flipper.showNext();flipper.startFlipping();}else if(startX - event.getX()<10||event.getX()-startX<10){//当左右滑动的坐标差<10时,可以确定为点击动作,解决了OnTouch和OnClick的冲突//Toast.makeText(context, "当前索引"+flipper.getDisplayedChild(), Toast.LENGTH_SHORT).show();data.get(flipper.getDisplayedChild());Intent intent = new Intent();intent.putExtra("titleName",data.get(flipper.getDisplayedChild()).getImageName());//传递文章标题intent.putExtra("textUrl", data.get(flipper.getDisplayedChild()).getTextUrl());//传递文章的URLintent.setClass(context, WebActivity.class);context.startActivity(intent);}break;}//返回false只执行一次监听,返回true会一直进行监听return true;}}); }
}

CarouselImage类

public class CarouselImage {private String imageName;   private String imageUrl;private String textUrl;public String getImageName() {return imageName;}public void setImageName(String imageName) {this.imageName = imageName;}public String getImageUrl() {return imageUrl;}public void setImageUrl(String imageUrl) {this.imageUrl = imageUrl;}public String getTextUrl() {return textUrl;}public void setTextUrl(String textUrl) {this.textUrl = textUrl;}
}

fragment加载的xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginBottom="50dp"android:orientation="vertical"android:weightSum="3" ><ViewFlipper android:id="@+id/viewFlipper"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></ViewFlipper><GridView android:id="@+id/gridView"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="2"android:layout_marginTop="20dp"android:gravity="center_horizontal"android:numColumns="3"android:stretchMode="columnWidth"></GridView>
</LinearLayout>

贴下图
这里写图片描述

这篇关于在fragment中用ViewFlipper做网络图片轮播手动+自动+点击事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671592

相关文章

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de