android gallery 自定义边框+幻灯片效果

时间:2021-07-17 08:26:51

最近在项目中用到图片轮播,试了Gallery,ViewFlipper,ViewPager,感觉Gallery最符合需求,但是Gallery的系统边框很难看,项目中要求用自己的背景图片。

下面来看一下使用Gallery实现图片轮播

运行效果:

android gallery 自定义边框+幻灯片效果

布局文件:

  1. <FrameLayout
  2. android:layout_width="fill_parent"
  3. android:layout_height="wrap_content"
  4. android:paddingLeft="16dp"
  5. android:paddingRight="16dp"
  6. android:paddingTop="10dp" >
  7. <Gallery
  8. android:id="@+id/gallery"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:fadingEdge="none"
  12. android:spacing="0dp" />
  13. <RelativeLayout
  14. android:layout_width="fill_parent"
  15. android:layout_height="18dp"
  16. android:layout_gravity="bottom"
  17. android:layout_marginBottom="3dp"
  18. android:layout_marginLeft="3dp"
  19. android:layout_marginRight="3dp"
  20. android:background="#80776f63"
  21. android:gravity="center" >
  22. <ImageView
  23. android:id="@+id/dot_1"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:src="@drawable/ic_dot_normal" />
  27. <ImageView
  28. android:id="@+id/dot_2"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:layout_marginLeft="10dp"
  32. android:layout_toRightOf="@+id/dot_1"
  33. android:src="@drawable/ic_dot_normal" />
  34. <ImageView
  35. android:id="@+id/dot_3"
  36. android:layout_width="wrap_content"
  37. android:layout_height="wrap_content"
  38. android:layout_marginLeft="10dp"
  39. android:layout_marginRight="10dp"
  40. android:layout_toRightOf="@+id/dot_2"
  41. android:src="@drawable/ic_dot_normal" />
  42. </RelativeLayout>
  43. </FrameLayout>

其中, android:fadingEdge="none"消除图片两边的阴影。使用FrameLayout在底部显示小圆点

  1. public class MainActivity extends Activity {
  2. private Gallery mGallery;
  3. private int index = 0;// 记录选中的图片位置
  4. private ImageView[] mImageViewIds;// 小圆点ImageView数组
  5. private static final int IMAGE_COUNT = 3;// 小圆点个数
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. findViews();
  11. mImageViewIds[0].setImageDrawable(getBaseContext().getResources()
  12. .getDrawable(R.drawable.ic_dot_focused));
  13. ImageAdapteradapter = new ImageAdapter(this);
  14. mGallery.setAdapter(adapter);
  15. Timer timer = new Timer();
  16. timer.schedule(task, 2000, 2000);
  17. mGallery.setOnItemSelectedListener(onItemSelectedListener);
  18. mGallery.setOnItemClickListener(onItemClickListener);
  19. }
  20. private void findViews() {
  21. mGallery = (Gallery) findViewById(R.id.gallery);
  22. mImageViewIds = new ImageView[] { (ImageView) findViewById(R.id.dot_1),
  23. (ImageView) findViewById(R.id.dot_2),
  24. (ImageView) findViewById(R.id.dot_3) };
  25. }
  26. private TimerTask task = new TimerTask() {
  27. @Override
  28. public void run() {
  29. Message message = new Message();
  30. message.what = 2;
  31. index = mGallery.getSelectedItemPosition();
  32. index++;
  33. handler.sendMessage(message);
  34. }
  35. };
  36. /**
  37. * 开一个线程执行耗时操作
  38. */
  39. private Handler handler = new Handler() {
  40. @Override
  41. public void handleMessage(Message msg) {
  42. super.handleMessage(msg);
  43. switch (msg.what) {
  44. case 2:
  45. mGallery.setSelection(index);
  46. break;
  47. default:
  48. break;
  49. }
  50. }
  51. };
  52. /**
  53. * 设置小圆点显示,position会一直增加,如果要循环显示图片,需要对position取余,否则数组越界
  54. */
  55. private OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {
  56. @Override
  57. public void onItemSelected(AdapterView<?> parent, View view,
  58. int position, long id) {
  59. int pos = position % IMAGE_COUNT;
  60. mImageViewIds[pos].setImageDrawable(getBaseContext().getResources()
  61. .getDrawable(R.drawable.ic_dot_focused));
  62. if (pos > 0) {
  63. mImageViewIds[pos - 1].setImageDrawable(getBaseContext()
  64. .getResources().getDrawable(R.drawable.ic_dot_normal));
  65. }
  66. if (pos < (IMAGE_COUNT - 1)) {
  67. mImageViewIds[pos + 1].setImageDrawable(getBaseContext()
  68. .getResources().getDrawable(R.drawable.ic_dot_normal));
  69. }
  70. if (pos == 0) {
  71. mImageViewIds[IMAGE_COUNT - 1]
  72. .setImageDrawable(getBaseContext().getResources()
  73. .getDrawable(R.drawable.ic_dot_normal));
  74. }
  75. }
  76. @Override
  77. public void onNothingSelected(AdapterView<?> arg0) {
  78. // TODO Auto-generated method stub
  79. }
  80. };
  81. /**
  82. * 点击事件,点击图片进入SecondActivity
  83. */
  84. private OnItemClickListener onItemClickListener = new OnItemClickListener() {
  85. @Override
  86. public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
  87. long arg3) {
  88. Intent intent = new Intent();
  89. intent.setClass(MainActivity.this, SecondActivity.class);
  90. startActivity(intent);
  91. }
  92. };
  93. }

ImageAdapter类,重写android.widget.BaseAdapter,用于描述图像信息。

  1. public class ImageAdapter extends BaseAdapter {
  2. private Context context;
  3. private int[] mImages = { R.drawable.bg_timeline_01,
  4. R.drawable.bg_timeline_02, R.drawable.bg_timeline_03 };
  5. private static final int IMAGE_PX_HEIGHT = 198;
  6. public ImageAdapter(Context context) {
  7. this.context = context;
  8. }
  9. @Override
  10. public int getCount() {
  11. return Integer.MAX_VALUE;//实现循环显示
  12. }
  13. @Override
  14. public Object getItem(int position) {
  15. return position;
  16. }
  17. @Override
  18. public long getItemId(int position) {
  19. return position;
  20. }
  21. @Override
  22. public View getView(int position, View convertView, ViewGroup parent) {
  23. ImageView imageView = new ImageView(context);
  24. imageView.setImageResource(mImages[position % mImages.length]);
  25. imageView.setScaleType(ImageView.ScaleType.CENTER);
  26. imageView.setLayoutParams(new Gallery.LayoutParams(
  27. Gallery.LayoutParams.FILL_PARENT, IMAGE_PX_HEIGHT));
  28. RelativeLayout borderImg = new RelativeLayout(context);
  29. borderImg.setPadding(2, 2, 2, 2);
  30. borderImg.setBackgroundResource(R.drawable.bg_gallery);//设置ImageView边框
  31. borderImg.addView(imageView);
  32. return borderImg;
  33. }
  34. }

如果用系统背景,可以这样写

  1. int mGalleryItemBackground;
  2. private Context mContext;
  3. public ImageAdapter(Context context)
  4. {
  5. mContext = context;
  6. // 获得Gallery组件的属性
  7. TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
  8. mGalleryItemBackground = typedArray.getResourceId(
  9. R.styleable.Gallery_android_galleryItemBackground, 0);
  10. }

在getview中设置

  1. imageView.setBackgroundResource(mGalleryItemBackground);

Gallery组件属性信息定义在res\values\attrs.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="Gallery">
  4. <attr name="android:galleryItemBackground" />
  5. </declare-styleable>
  6. </resources>

详细讲解见http://www.eoeandroid.com/forum.php?mod=viewthread&tid=182297

自定义边框参考http://*.com/questions/4830173/change-border-style-in-gallery

android gallery 自定义边框+幻灯片效果的更多相关文章

  1. android gallery 自定义边框&plus;幻灯片

    最近在项目中用到图片轮播,试了Gallery,ViewFlipper,ViewPager,感觉Gallery最符合需求,但是Gallery的系统边框很难看,项目中要求用自己的背景图片. 下面来看一下使 ...

  2. Android checkbox 自定义点击效果

    安卓默认的效果                         自定义后的效果 前面的图片当然可以自己修改. 实现这个效果的步骤如下 1.建立 一个selector 的xml <?xml ver ...

  3. Android之EditText自定义边框和边框颜色(转载)

    介绍一种比较常见的用法 第一步:准备两张图片大小一样,颜色不同的图片.图片名称分为:editbox_focus.png和editbox_normal.png 放入工程的drawable文件夹下. 第二 ...

  4. Android之Button自定义点击效果

    我们在界面上经常会用到button按钮,但通常button点击后看不到点击的效果,如果用户连续点击了两次,就会报NAR错误,这样交互性就比较差了.如果我们自定义了button点击效果,比如我们点击了b ...

  5. Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View

    一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...

  6. Android自定义类似ProgressDialog效果的Dialog

    Android自定义类似ProgressDialog效果的Dialog. 方法如下: 1.首先准备两张自己要定义成哪样子的效果的图片和背景图片(也可以不要背景). 如我要的效果: 2.定义loadin ...

  7. 50个Android开发人员必备UI效果源码&lbrack;转载&rsqb;

    50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...

  8. &lbrack;转载&rsqb; 50个Android开发人员必备UI效果源码

    好东西,多学习! Android 仿微信之主页面实现篇Android 仿微信之界面导航篇Android 高仿QQ 好友分组列表Android 高仿QQ 界面滑动效果Android 高仿QQ 登陆界面A ...

  9. Android自定义控件 -- 带边框的TextView

    使用xml实现边框 原来使用带边框的TextView时一般都是用XML定义来完成,在drawable目录中定义如下所示的xml文件: <?xml version="1.0" ...

随机推荐

  1. mac 下更新 &period;bash&lowbar;profile 文件

    1.打开terminal(终端) 2.cd ~ ( 进入当前用户的home目录) 3.open .bash_profile (打开.bash_profile文件,如果文件不存在就  创建文件:touc ...

  2. &lbrack;C&sol;C&plus;&plus;&rsqb;C&plus;&plus;标准

    本文若如特别说明都引于ISO/IEC 14882:2011 7.声明(Declarations) 声明序列(declaration-seq):    声明(declaration)    声明序列(d ...

  3. phpcms v9 中get的mysql查询表某字段最大值数据,表某字段不重复数据

    直切正题 1.表tb中字段num最大的数据 {pc:get $sql="select * from tb where num=(select MAX(num) from tb)"} ...

  4. 判断不同IOS设备

    var iOSGen = iPhone.generation; if (Debug.isDebugBuild) { Debug.Log("iPhone.generation : " ...

  5. 将 JSP 中数组传递给 js

    <%       String[]  name   =   { "w ", "a ", "n ", "g"}; % ...

  6. Linux指令--cat&comma;tac

    原文出处:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内 ...

  7. Mycat 介绍

    Mycat 是什么 Mycat是什么?从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了 MySQL协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL客户端工具和命 ...

  8. &lbrack;ASP&period;NET Core&rsqb; 建置x86版本 &lpar;workaround&rpar;

    前言 本篇文章介绍如何建置ASP.NET Core项目的x86版本输出(workaround),为自己留个纪录也希望能帮助到有需要的开发人员. ASP.NET Core官网 步骤 首先到微软官网的「. ...

  9. redis的数据持久化存储

    Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化.Redis支持两种持久化方式: 一.snapshotting(快照)方式快照是默认的持久化方式. ...

  10. C语言实验报告(五) 两个正整数的最大公约数

    编程实现求两个正整数的最大公约数,要求计算最大公约数用函数fun(int a,int b)实现. #include<stdio.h>void main(){  int n,a,b;  in ...