Android中使用GridView和ImageViewSwitcher實現電子相冊簡單功能

来源:http://www.cnblogs.com/panhouye/archive/2016/12/05/6135949.html
-Advertisement-
Play Games

我們在手機上查看相冊時,首先看到的是網格狀的圖片展示界面,然後我們選擇想要欣賞的照片點擊進入,這樣就可以全屏觀看該照片,並且可以通過左右滑動來切換照片。如下圖的顯示效果: 首先我們先羅列一下本次實現所要用的知識點: (1)首頁界面,我們需要可以通過GridView來實現,有關GridView的實現代 ...


我們在手機上查看相冊時,首先看到的是網格狀的圖片展示界面,然後我們選擇想要欣賞的照片點擊進入,這樣就可以全屏觀看該照片,並且可以通過左右滑動來切換照片。如下圖的顯示效果:

首先我們先羅列一下本次實現所要用的知識點:

(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,後面會有詳細講述,敬請關註大笑

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 部署React+webpack工程的步驟ps:以Mac os系統做開發環境。因為npm現在使用灰常的慢,所以我使用淘寶境像cnpm。 1,準備工作: 先確保存已經安裝了node.js; 2,文件部署: (1),在終端中找到react-build項目的目錄,鍵入cnpm init初始化一個pack ...
  • 先貼出github地址:https://github.com/svgdotjs/svg.js(也就是原文檔的說明和文件的下載地址) 創建SVG文檔 此時已經可以運行,運行生成的html代碼如下: 也可以在生成SVG之前對該當前使用的瀏覽器進行判斷,是否支持SVG 此外關於鏈接還有N多個相關操作,可以 ...
  • Notification是在你的應用常規界面之外展示的消息。當app讓系統發送一個消息的時候,消息首先以圖表的形式顯示在通知欄。要查看消息的詳情需要進入通知抽屜(notificationdrawer)中查看。(notificationdrawer)都是系統層面控制的,你可以隨時查看,不限制於app。 ...
  • 1. ...
  • 組內非同步會與組外順序執行的事件爭搶資源 1)、創建一個組 2)、組內非同步ST1,DISPATCH_QUEUE_PRIORITY_DEFAULT 為預設優先順序 3)、組內非同步ST2,DISPATCH_QUEUE_PRIORITY_DEFAULT 為預設優先順序 4)、組內通知,獲取主線程。組內非同步全部執 ...
  • viewport預備知識 dpr === dppx dpr:device pixel ratio 設備像素比 dppx:Number of dots per px unit 每像素有多少點 。 1dppx = 96dpi dpr = 設備物理像素 / 設備獨立像素 設備物理像素指顯示在移動端中實際的 ...
  • 在學習新內容之前,我們先來弄清楚兩個問題: 1 . 什麼是ViewGroup? ViewGroup是一種容器。它包含零個或以上的View及子View。 2 . ViewGroup有什麼作用? ViewGroup內部可以用來存放多個View控制項,並且根據自身的測量模式,來測量View子控制項,並且... ...
  • 提交審核後進去下麵鏈接申請加急審核鏈接:https://developer.apple.com/appstore/contact/appreviewteam/index.html 在I would like to選擇加急審核(預設選項) 填寫相關信息 最後一項可以不填 最後是申請原因跟理由 看見別人 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...