Android学QQ空间相册浏览类型横向滑动效果显示多图片MyHorizontalScrollView

我们来定制一下吧

布局文件:activity_main.xml

<LinearLayout 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:background="@android:color/white"android:orientation="vertical" ><FrameLayoutandroid:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="1" ><ImageViewandroid:id="@+id/id_content"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_gravity="center"android:layout_margin="10dp"android:scaleType="centerCrop"android:src="@mipmap/ic_launcher" /></FrameLayout><com.example.lenovo.myapplication.MyHorizontalScrollViewandroid:id="@+id/id_horizontalScrollView"android:layout_width="wrap_content"android:layout_height="150dp"android:layout_gravity="bottom"android:background="@android:color/white"android:scrollbars="none" ><LinearLayoutandroid:id="@+id/id_gallery"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:orientation="horizontal" ></LinearLayout></com.example.lenovo.myapplication.MyHorizontalScrollView></LinearLayout>

布局文件:activity_index_gallery_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="120dp"android:layout_height="130dp"android:background="@android:color/white" ><ImageView
        android:id="@+id/id_index_gallery_item_image"android:layout_width="80dp"android:layout_height="80dp"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:layout_margin="5dp"android:scaleType="centerCrop" /><TextView
        android:id="@+id/id_index_gallery_item_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/id_index_gallery_item_image"android:layout_centerHorizontal="true"android:layout_marginBottom="5dp"android:layout_marginTop="5dp"android:textColor="#ff0000"android:textSize="12dp" /></RelativeLayout>

展示视图控制文件:MainActivity

package com.example.lenovo.myapplication;import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class MainActivity extends Activity
{private MyHorizontalScrollView mHorizontalScrollView;private HorizontalScrollViewAdapter mAdapter;private ImageView mImg;private List<Integer> mDatas = new ArrayList<Integer>(Arrays.asList(R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d,R.drawable.e, R.drawable.f, R.drawable.g, R.drawable.h,R.drawable.l));@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);mImg = (ImageView) findViewById(R.id.id_content);mHorizontalScrollView = (MyHorizontalScrollView) findViewById(R.id.id_horizontalScrollView);mAdapter = new HorizontalScrollViewAdapter(this, mDatas);//添加滚动回调mHorizontalScrollView.setCurrentImageChangeListener(new MyHorizontalScrollView.CurrentImageChangeListener(){@Overridepublic void onCurrentImgChanged(int position,View viewIndicator){mImg.setImageResource(mDatas.get(position));viewIndicator.setBackgroundColor(Color.parseColor("#AA024DA4"));}});//添加点击回调mHorizontalScrollView.setOnItemClickListener(new MyHorizontalScrollView.OnItemClickListener(){@Overridepublic void onClick(View view, int position){mImg.setImageResource(mDatas.get(position));view.setBackgroundColor(Color.parseColor("#AA024DA4"));}});//设置适配器mHorizontalScrollView.initDatas(mAdapter);}}

这里接触一下适配器HorizontalScrollViewAdapter

package com.example.lenovo.myapplication;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import java.util.List;/*** Created by yang_zzheng on 2016/7/13* yangzhizheng2012@163.com*/
public class HorizontalScrollViewAdapter
{private Context mContext;private LayoutInflater mInflater;private List<Integer> mDatas;public HorizontalScrollViewAdapter(Context context, List<Integer> mDatas){this.mContext = context;mInflater = LayoutInflater.from(context);this.mDatas = mDatas;}public int getCount(){return mDatas.size();}public Object getItem(int position){return mDatas.get(position);}public long getItemId(int position){return position;}public View getView(int position, View convertView, ViewGroup parent){ViewHolder viewHolder = null;if (convertView == null){viewHolder = new ViewHolder();convertView = mInflater.inflate(R.layout.activity_index_gallery_item, parent, false);viewHolder.mImg = (ImageView) convertView.findViewById(R.id.id_index_gallery_item_image);viewHolder.mText = (TextView) convertView.findViewById(R.id.id_index_gallery_item_text);convertView.setTag(viewHolder);} else{viewHolder = (ViewHolder) convertView.getTag();}viewHolder.mImg.setImageResource(mDatas.get(position));viewHolder.mText.setText("美女");return convertView;}private class ViewHolder{ImageView mImg;TextView mText;}}

我们自己定义的滚动条MyHorizontalScrollView

package com.example.lenovo.myapplication;import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;import java.util.HashMap;
import java.util.Map;/*** Created by yang_zzheng on 2016/7/13* yangzhizheng2012@163.com*/
public class MyHorizontalScrollView extends HorizontalScrollView implementsView.OnClickListener
{/*** 图片滚动时的回调接口** @author zhy**/public interface CurrentImageChangeListener{void onCurrentImgChanged(int position, View viewIndicator);}/*** 条目点击时的回调** @author zhy**/public interface OnItemClickListener{void onClick(View view, int pos);}private CurrentImageChangeListener mListener;private OnItemClickListener mOnClickListener;private static final String TAG = "MyHorizontalScrollView";/*** HorizontalListView中的LinearLayout*/private LinearLayout mContainer;/*** 子元素的宽度*/private int mChildWidth;/*** 子元素的高度*/private int mChildHeight;/*** 当前最后一张图片的index*/private int mCurrentIndex;/*** 当前第一张图片的下标*/private int mFristIndex;/*** 当前第一个View*/private View mFirstView;/*** 数据适配器*/private HorizontalScrollViewAdapter mAdapter;/*** 每屏幕最多显示的个数*/private int mCountOneScreen;/*** 屏幕的宽度*/private int mScreenWitdh;/*** 保存View与位置的键值对*/private Map<View, Integer> mViewPos = new HashMap<View, Integer>();public MyHorizontalScrollView(Context context, AttributeSet attrs){super(context, attrs);// 获得屏幕宽度WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);mScreenWitdh = outMetrics.widthPixels;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){super.onMeasure(widthMeasureSpec, heightMeasureSpec);mContainer = (LinearLayout) getChildAt(0);}/*** 加载下一张图片*/protected void loadNextImg(){// 数组边界值计算if (mCurrentIndex == mAdapter.getCount() - 1){return;}//移除第一张图片,且将水平滚动位置置0scrollTo(0, 0);mViewPos.remove(mContainer.getChildAt(0));mContainer.removeViewAt(0);//获取下一张图片,并且设置onclick事件,且加入容器中View view = mAdapter.getView(++mCurrentIndex, null, mContainer);view.setOnClickListener(this);mContainer.addView(view);mViewPos.put(view, mCurrentIndex);//当前第一张图片小标mFristIndex++;//如果设置了滚动监听则触发if (mListener != null){notifyCurrentImgChanged();}}/*** 加载前一张图片*/protected void loadPreImg(){//如果当前已经是第一张,则返回if (mFristIndex == 0)return;//获得当前应该显示为第一张图片的下标int index = mCurrentIndex - mCountOneScreen;if (index >= 0){
//          mContainer = (LinearLayout) getChildAt(0);//移除最后一张int oldViewPos = mContainer.getChildCount() - 1;mViewPos.remove(mContainer.getChildAt(oldViewPos));mContainer.removeViewAt(oldViewPos);//将此View放入第一个位置View view = mAdapter.getView(index, null, mContainer);mViewPos.put(view, index);mContainer.addView(view, 0);view.setOnClickListener(this);//水平滚动位置向左移动view的宽度个像素scrollTo(mChildWidth, 0);//当前位置--,当前第一个显示的下标--mCurrentIndex--;mFristIndex--;//回调if (mListener != null){notifyCurrentImgChanged();}}}/*** 滑动时的回调*/public void notifyCurrentImgChanged(){//先清除所有的背景色,点击时会设置为蓝色for (int i = 0; i < mContainer.getChildCount(); i++){mContainer.getChildAt(i).setBackgroundColor(Color.WHITE);}mListener.onCurrentImgChanged(mFristIndex, mContainer.getChildAt(0));}/*** 初始化数据,设置数据适配器** @param mAdapter*/public void initDatas(HorizontalScrollViewAdapter mAdapter){this.mAdapter = mAdapter;mContainer = (LinearLayout) getChildAt(0);// 获得适配器中第一个Viewfinal View view = mAdapter.getView(0, null, mContainer);mContainer.addView(view);// 强制计算当前View的宽和高if (mChildWidth == 0 && mChildHeight == 0){int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);view.measure(w, h);mChildHeight = view.getMeasuredHeight();mChildWidth = view.getMeasuredWidth();Log.e(TAG, view.getMeasuredWidth() + "," + view.getMeasuredHeight());mChildHeight = view.getMeasuredHeight();// 计算每次加载多少个ViewmCountOneScreen = (mScreenWitdh / mChildWidth == 0)?mScreenWitdh / mChildWidth+1:mScreenWitdh / mChildWidth+2;Log.e(TAG, "mCountOneScreen = " + mCountOneScreen+ " ,mChildWidth = " + mChildWidth);}//初始化第一屏幕的元素initFirstScreenChildren(mCountOneScreen);}/*** 加载第一屏的View** @param mCountOneScreen*/public void initFirstScreenChildren(int mCountOneScreen){mContainer = (LinearLayout) getChildAt(0);mContainer.removeAllViews();mViewPos.clear();for (int i = 0; i < mCountOneScreen; i++){View view = mAdapter.getView(i, null, mContainer);view.setOnClickListener(this);mContainer.addView(view);mViewPos.put(view, i);mCurrentIndex = i;}if (mListener != null){notifyCurrentImgChanged();}}@Overridepublic boolean onTouchEvent(MotionEvent ev){switch (ev.getAction()){case MotionEvent.ACTION_MOVE:
//          Log.e(TAG, getScrollX() + "");int scrollX = getScrollX();// 如果当前scrollX为view的宽度,加载下一张,移除第一张if (scrollX >= mChildWidth){loadNextImg();}// 如果当前scrollX = 0, 往前设置一张,移除最后一张if (scrollX == 0){loadPreImg();}break;}return super.onTouchEvent(ev);}@Overridepublic void onClick(View v){if (mOnClickListener != null){for (int i = 0; i < mContainer.getChildCount(); i++){mContainer.getChildAt(i).setBackgroundColor(Color.WHITE);}mOnClickListener.onClick(v, mViewPos.get(v));}}public void setOnItemClickListener(OnItemClickListener mOnClickListener){this.mOnClickListener = mOnClickListener;}public void setCurrentImageChangeListener(CurrentImageChangeListener mListener){this.mListener = mListener;}}

哈哈是不是有种别样的感觉:

本文需要的照片:








瞬间美美的

本文学习参考:

http://blog.csdn.net/lmj623565791/article/details/38140505/

Android学QQ空间相册浏览类型横向滑动效果显示多图片MyHorizontalScrollView相关推荐

  1. html5 图片横向滑动效果,JS实现图片横向滚动效果示例代码

    图片横向滚动代码 .box{ margin:0 auto; height:70px; width:810px; padding:10px; border:1px solid #FF0000; } .b ...

  2. android qq空间效果,更新UI设计 Android手机QQ空间1.2详测

    近日,腾讯发布了Android手机QQ空间1.2版.经过一周的试用,小编认为该版QQ空间的多项创新,大大地发挥了Android平台的价值. 从测试结果来看,Android手机QQ空间1.2版在原有便捷 ...

  3. 如何备份你的 QQ 空间相册

    领红包方法见文末 周末无聊的时候打开了下久违的QQ空间,那么多年的记录都还在.曾经建的杰伦相册. 想到之前网易相册都关闭了,虽然腾讯家大业大,但万一呢,于是想着把QQ空间的图片都备份下来.于是有了今天 ...

  4. qq空间 for android,手机QQ空间Android新版发布 支持widget

    近日,腾讯正式发布手机QQ空间Android平台1.2版,新增了10多项常用新功能,体验方面有多达20多个专项优化,界面焕然一新.它大幅完善了手机QQ空间的写日志.带图说说功能,还实现了手机桌面wid ...

  5. php实现qq相册功能,使用javascript如何实现QQ空间相册展示

    本文给大家分享基于javascript制作的qq空间相册展示效果,涉及到html\css布局思维,浮动定位详解,具体实现代码大家参考下本文 知识点:html/css布局思维,浮动/定位详解,大企业标准 ...

  6. QQ空间相册展示特效

    <!doctype html> <html lang="en"> <head> <title>QQ空间相册展示特效<title ...

  7. Python_小林的爬取QQ空间相册图片链接程序

    前言 昨天看见某人的空间有上传了XXXX个头像,然后我就想着下载回来[所以本质上这是一个头像下载程序],但是一个个另存为太浪费时间了,上网搜索有没有现成的工具,居然要注册码,还卖45一套.你们的良心也 ...

  8. php爬取qq好友,使用php批量抓取QQ空间相册链接

    前言 小杰之前发布的文章<为什么QQ空间与我们渐行渐远?> 里面就提到小杰会抽空备份QQ空间的照片,但是在网上找了很久也没有找到一个有效的工具 作为一个Phper,淦就完事了,所以顶着寒冷 ...

  9. 通过抓包获取QQ空间相册的真实地址,实现空间相册下载。

    在网上找过相关的资料,都不是太全~有些缺漏.所有自己根据网上的再结合自己的修改了下. 1.通过HttpAnalyzerStdV5 分析QQ空间相册的真实地址.一下就是空间相册的地址: 之前在网上看见只 ...

最新文章

  1. js能关闭HTML页面,javascript可以关闭吗
  2. stream流map 多个字段_stream流根据对象指定字段去重
  3. 读javascript高级程序设计11-事件
  4. Leetcode每日一题:1024.video-stitching(视频拼接)
  5. 门槛低的行业看天赋,门槛高的行业看毅力
  6. Python制作彩色二维码
  7. android studio 安装sdk和android,请问android studio怎么安装sdk
  8. Asp.net mvc 集成Autofac和FluentValidation
  9. 恒强制版系统980_恒强制版软件操作答疑
  10. Last packet sent to the server was 2 ms ago 解决办法
  11. 2021年美容师(初级)考试资料及美容师(初级)
  12. 测试岗面试,一份好的简历总可以让人眼前一亮
  13. 一、Docker:Linux/Windows在线安装Docker与命令大全总结
  14. 太阳能电池板自动清洗机器人的制作分享
  15. 多线阵列激光三维扫描系统及多线阵列激光三维扫描方法
  16. Basemap绘制中国地图
  17. CAN IP SjA1000ip核 verilog写的 项目以在稳定的用
  18. Python程序设计题库——第五章
  19. [Git可视化工具] SourceTree
  20. 潇 洒 女 兵 分 解

热门文章

  1. 叮咚谁呀我是送信的邮递员呀_《幼儿园听说游戏》PPT课件.ppt
  2. 年轻时应该养成的十大好习惯
  3. Linux | 文件系统
  4. 个人简历”的Resume(java封装类)
  5. 新十年,千万级ERP加速起航
  6. 揭示微软鲜为人知的秘密:观止--微软创建NT和未来的夺命狂奔 (Show Stopper!中文版)...
  7. Android(数据存储:文件存储、SharedPreferences)验证QQ密码
  8. 第十一届蓝桥软件类JavaB组
  9. f1c100s spi nand 128MB W25N01G 调试记录
  10. ADAS/AD系统解决方案介绍