zoukankan      html  css  js  c++  java
  • Android中使用GridView和ImageViewSwitcher实现电子相册简单功能

    我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片。如下图的显示效果:

    首先我们先罗列一下本次实现所要用的知识点:

    (1)首页界面,我们需要可以通过GridView来实现,有关GridView的实现代码以及讲解请参照本人相关博文:

    Android中GridView通过自定义适配器(未优化)实现图文视图排列

    (2)具体照片的展示以及左右切换效果,可以实现这个效果的方法很多(ViewPager,ViewFlipper,ImageViewSwitcher等),可以参照相关博文:

    Android中使用ViewPager实现屏幕页面切换和页面切换效果

    Android中使用ViewFlipper实现屏幕页面切换(关于坐标轴的问题已补充更改)

    Android中使用ImageViewSwitcher实现图片切换轮播导航效果

    (3)实现Activity之间的跳转以及照片标记位置的传递需要用到intent,并分别使用putExtra以及getExtra,传入和获取照片的标记位置。

    (关于intent,后期会有专门博文介绍具体使用,请大家持续关注哦)

    下面我们开始功能的实现:

    第一步:Layout中建立首页GridView布局grid_layout.xml文件:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:orientation="vertical" android:layout_width="match_parent"
     4     android:layout_height="match_parent">
     5     <GridView
     6         android:id="@+id/gv"
     7         android:layout_width="match_parent"
     8         android:layout_height="wrap_content"
     9         android:numColumns="auto_fit"
    10         android:verticalSpacing="10dp"
    11         android:gravity="center"
    12         android:horizontalSpacing="10dp"></GridView>
    13 </LinearLayout>

    第二步:Layout中建立GridView布局中每个item的布局griditem_layout.xml文件:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:app="http://schemas.android.com/apk/res-auto"
     4     android:orientation="vertical" android:layout_width="wrap_content"
     5     android:layout_height="wrap_content"
     6     android:gravity="center">
     7     <ImageView
     8         android:layout_width="wrap_content"
     9         android:layout_height="wrap_content"
    10         android:adjustViewBounds="true"
    11         android:maxWidth="280dp"
    12         android:maxHeight="280dp"
    13         android:src="@mipmap/a1"
    14         android:id="@+id/imageView" />
    15 </LinearLayout>

    这里的设置需要根据实际展示图片的宽度以及要展示的容器(手机)分辨率来设置等比例缩放,避免排版混乱的情况出现。

    第三步:Layout中建立图片展示界面(包含导航圆点)布局activity_main.xml文件:

    这里主布局使用FrameLayout,切换实现布局使用ImageSwitcher,导航圆点使用linearlayout实现(可通过配置文件实现):

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:tools="http://schemas.android.com/tools"
     4     android:id="@+id/activity_main"
     5     android:layout_width="match_parent"
     6     android:layout_height="match_parent"
     7     tools:context="com.example.administrator.switcher.MainActivity">
     8     <ImageSwitcher
     9         android:layout_width="match_parent"
    10         android:layout_height="match_parent"
    11         android:id="@+id/is">
    12     </ImageSwitcher>
    13     <LinearLayout
    14         android:id="@+id/point_layout"
    15         android:layout_width="match_parent"
    16         android:layout_height="wrap_content"
    17         android:layout_gravity="bottom"
    18         android:orientation="horizontal">
    19         <ImageView
    20             android:layout_width="wrap_content"
    21             android:layout_height="wrap_content"
    22             android:layout_weight="1"
    23             android:src="@mipmap/default_holo"/>
    24         <ImageView
    25             android:layout_width="wrap_content"
    26             android:layout_height="wrap_content"
    27             android:layout_weight="1"
    28             android:src="@mipmap/default_holo"/>
    29         <ImageView
    30             android:layout_width="wrap_content"
    31             android:layout_height="wrap_content"
    32             android:layout_weight="1"
    33             android:src="@mipmap/default_holo"/>
    34         <ImageView
    35             android:layout_width="wrap_content"
    36             android:layout_height="wrap_content"
    37             android:layout_weight="1"
    38             android:src="@mipmap/default_holo"/>
    39     </LinearLayout>
    40 </FrameLayout>

    第四步:Java中Activity的实现代码,首页GridView的实现代码GridActivity.java:

    这里涉及到的知识点请参照

    Android中GridView通过自定义适配器(未优化)实现图文视图排列

    本次自定义适配器中getview方法已经优化:

     1 import android.content.Intent;
     2 import android.support.v7.app.AppCompatActivity;
     3 import android.os.Bundle;
     4 import android.view.View;
     5 import android.view.ViewGroup;
     6 import android.widget.AdapterView;
     7 import android.widget.BaseAdapter;
     8 import android.widget.GridView;
     9 import android.widget.ImageView;
    10 public class GridActivity extends AppCompatActivity {
    11     private GridView gv;
    12     int[] images={R.mipmap.a1,R.mipmap.a2,R.mipmap.a3,R.mipmap.a4};
    13     @Override
    14     protected void onCreate(Bundle savedInstanceState) {
    15         super.onCreate(savedInstanceState);
    16         setContentView(R.layout.grid_layout);
    17         gv= (GridView) findViewById(R.id.gv);
    18         gv.setAdapter(new MyAdapter());
    19         //设置单击GridView中每个item的单击事件
    20         gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    21             @Override
    22             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    23                 //使用intend获取要交互的Activity,也就是将要跳转的界面
    24                 Intent intent = new Intent(GridActivity.this,MainActivity.class);
    25                 //通过intent的putExtra方法获取点击图片的下标位置(用于Activity之间数据传输)
    26                 intent.putExtra("select",position);
    27                 //启动要交互的Activity(通过传入包含该Activity的intent)
    28                 startActivity(intent);
    29             }
    30         });
    31     }
    32     class MyAdapter extends BaseAdapter{
    33 
    34         @Override
    35         public int getCount() {
    36             return images.length;
    37         }
    38 
    39         @Override
    40         public Object getItem(int position) {
    41             return images[position];
    42         }
    43 
    44         @Override
    45         public long getItemId(int position) {
    46             return position;
    47         }
    48 
    49         @Override
    50         public View getView(int position, View convertView, ViewGroup parent) {
    51             ViewHolder vh;
    52             if(convertView==null){
    53                 convertView=getLayoutInflater().inflate(R.layout.griditem_layout,null);
    54                 vh= new ViewHolder();
    55                 vh.iv= (ImageView) convertView.findViewById(R.id.imageView);
    56                 convertView.setTag(vh);
    57             }
    58             vh= (ViewHolder) convertView.getTag();
    59             vh.iv.setImageResource(images[position]);
    60             return convertView;
    61         }
    62         class ViewHolder{
    63             ImageView iv;
    64         }
    65     }
    66 }

    第五步:Java中Activity的实现代码,跳转后的ImageSwicher的实现代码MainActivity.java:

    可参照博文

    Android中使用ImageViewSwitcher实现图片切换轮播导航效果

      1 import android.content.Intent;
      2 import android.support.v7.app.AppCompatActivity;
      3 import android.os.Bundle;
      4 import android.view.MotionEvent;
      5 import android.view.View;
      6 import android.widget.ImageSwitcher;
      7 import android.widget.ImageView;
      8 import android.widget.LinearLayout;
      9 import android.widget.ViewSwitcher;
     10 import java.util.ArrayList;
     11 /**
     12  * Created by panchengjia on 2016/12/05.
     13  */
     14 public class MainActivity extends AppCompatActivity implements ViewSwitcher.ViewFactory,View.OnTouchListener{
     15     private ImageSwitcher is;//声明ImageSwitcher布局
     16     private LinearLayout point_layout;//声明导航圆点的布局
     17     //图片id数组(需要与GridActivity中的图片资源数组一一对应)
     18     int[] images={R.mipmap.a1,R.mipmap.a2,R.mipmap.a3,R.mipmap.a4};
     19     //实例化存储导航圆点的集合
     20     ArrayList<ImageView> points = new ArrayList<>();
     21     int index;//声明index,记录图片id数组下标
     22     float startX;//手指接触屏幕时X的坐标(演示左右滑动)
     23     float endX;//手指离开屏幕时的坐标(演示左右滑动)
     24 
     25     @Override
     26     protected void onCreate(Bundle savedInstanceState) {
     27         super.onCreate(savedInstanceState);
     28         setContentView(R.layout.activity_main);
     29         //获取GridActivity中设置的intent
     30         Intent intent = getIntent();
     31         //获取GridActivity中得到的图片下标,并随意设置默认值
     32         index = intent.getIntExtra("select",0);
     33         is = (ImageSwitcher) findViewById(R.id.is);
     34         is.setFactory(this);//通过工厂实现ImageSwitcher
     35         initpoint();
     36         is.setOnTouchListener(this);//设置触摸事件
     37     }
     38     //初始化导航圆点的方法
     39     private void initpoint() {
     40         point_layout= (LinearLayout) findViewById(R.id.point_layout);
     41         int count = point_layout.getChildCount();//获取布局中圆点数量
     42         for(int i =0;i<count;i++){
     43             //将布局中的圆点加入到圆点集合中
     44             points.add((ImageView) point_layout.getChildAt(i));
     45         }
     46         //设置GridActivity中选中图片对应的圆点状态为触摸实心状态
     47         points.get(index).setImageResource(R.mipmap.touched_holo);
     48     }
     49     //设选中图片对应的导航原点的状态
     50     public void setImageBackground(int selectImage) {
     51         for(int i=0;i<points.size();i++){
     52             //如果选中图片的下标等于圆点集合中下标的id,则改变圆点状态
     53             if(i==selectImage){
     54                 points.get(i).setImageResource(R.mipmap.touched_holo);
     55             }else{
     56                 points.get(i).setImageResource(R.mipmap.default_holo);
     57             }
     58         }
     59     }
     60     //实现ViewFactory的方法实例化imageView(这里未设置ImageView的属性)
     61     @Override
     62     public View makeView() {
     63         //实例化一个用于切换的ImageView视图
     64         ImageView iv = new ImageView(this);
     65         iv.setScaleType(ImageView.ScaleType.FIT_XY);
     66         //默认展示的第一个视图为images[index](主页面跳转过来的图片)
     67         iv.setImageResource(images[index]);
     68         return iv;
     69     }
     70     @Override
     71     public boolean onTouch(View v, MotionEvent event) {
     72         //按下屏幕
     73         if(event.getAction()==MotionEvent.ACTION_DOWN){
     74             startX=event.getX();//获取按下屏幕时X轴的坐标
     75             //手指抬起
     76         }else if (event.getAction()==MotionEvent.ACTION_UP){
     77             endX=event.getX();
     78             //判断结束坐标大于起始坐标则为下一张(为避免误操作,设置30的判断区间)
     79             if(startX-endX>30){
     80                 //三目运算判断当前图片已经为最后一张,则从头开始
     81                 index = index+1<images.length?++index:0;
     82                 //使用系统自带的切换出入动画效果(也可以像ViewFlipper中一样自定义动画效果)
     83                 is.setInAnimation(this,android.R.anim.fade_in);
     84                 is.setOutAnimation(this,android.R.anim.fade_out);
     85 
     86                 //判断结束坐标小于于起始坐标则为上一张(为避免误操作,设置30的判断区间)
     87             }else if(endX-startX>30){
     88                 //三目运算判断当前图片已经为第一张,则上一张为数组内最后一张图片
     89                 index = index-1>=0?--index:images.length-1;
     90                 is.setInAnimation(this,android.R.anim.fade_in);
     91                 is.setOutAnimation(this,android.R.anim.fade_out);
     92             }
     93             //设置ImageSwitcher的图片资源
     94             is.setImageResource(images[index]);
     95             //调用方法设置圆点对应状态
     96             setImageBackground(index);
     97         }
     98         return true;
     99     }
    100 }

    本次代码展示到这里就结束了,按照前文所讲,大家可以尝试多种实现方法,本次使用到的intent,后面会有详细讲述,敬请关注大笑

  • 相关阅读:
    PyPDF2 编码问题 PyPDF2.utils.PdfReadError Illegal character in Name Object
    使用PyPDF2结合pdfminer拆分PDF,并提取关键字重命名拆分出来的文件
    最全面的常用正则表达式大全
    idea setting
    java基础-静态,非静态(构造)代码块,类加载
    利用复制(分发订阅)延时计算业务数据
    sql server 数据库复制实现数据同步常见问题(不定期更新)
    api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?
    install brew cask
    idea 找不到 没有 tomcat server
  • 原文地址:https://www.cnblogs.com/panhouye/p/6135949.html
Copyright © 2011-2022 走看看