1. 程式人生 > >Android 獲取並顯示遠端圖片 Picasso框架的使用(二)

Android 獲取並顯示遠端圖片 Picasso框架的使用(二)

在上篇文章中介紹了Picasso的基本用法,這篇文章作為以上的練習;

實現效果:(動圖請耐心載入)

這裡寫圖片描述

需要的知識點

我們需要編寫兩個佈局檔案:activity_gridview.xml activity_main.xml 以及ImageAdapter類、GridImageActivityMainActivity

如果你已經掌握了以上知識點,那接下來的程式碼部分會很輕鬆:

1.建立專案:UsePicasso :將Picasso新增進我們的專案,如何新增我就不用多贅述了吧(不知道的可以去看上一篇文章)~~ picasso-2.5.2.jar

2. 建立佈局檔案

我們需要建立一個網格佈局用來顯示圖片:res/layout/activity_gridview.xml

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/grid_view"
            android:numColumns="auto_fit"
            android:gravity="center"
            android:stretchMode="columnWidth"
            android:columnWidth
="90dp" android:horizontalSpacing="10dp" android:verticalSpacing="5dp" android:background="#ffffff" android:layout_width="match_parent" android:layout_height="match_parent">
</GridView>

GridView中有幾個屬性需要我們注意一下:

numColumns="auto_fit",這裡我們使用"auto_fit",當然你也可以指定固定值
stretchMode="columWidth",單元格拉伸型別,這裡僅拉伸表格元素本身
android:columnWidth="90dp",指定列寬
android:horizontalSpacing="10dp",水平間隔
android:verticalSpacing="5dp",豎直間隔

另一個佈局檔案:res/layout/activity_main.xml 用來顯示具體的某一張圖片:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:background="#00000000"
        android:padding="10dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:id="@+id/full_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

</LinearLayout>

3. 自定義Adapter:建立ImageAdapter類:我們需要繼承自BaseAdapter,並覆寫其中四個方法,最重要的就是getView()方法,最終通過它來控制具體View的顯示;這裡不再講解自定義Adapter的具體細節,不熟悉的同學可參考這篇文章:Using an ArrayAdapter with ListView

public class ImageAdapter extends BaseAdapter {

    private Context context;

    //圖片url地址(多張圖片)
    private ArrayList<String> urls;

    public ImageAdapter(Context context,ArrayList<String> urls) {
        this.context = context;
        this.urls=urls;
    }

    @Override
    public int getCount() {
        return urls.size();
    }

    @Override
    public Object getItem(int i) {
        return urls.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ImageView imageView=new ImageView(context);

        //設定placeholder和error image
            Picasso.with(context).load(urls.get(i)).placeholder(R.mipmap.image_placholder).error(R.mipmap.ic_launcher).into(imageView);

        //設定網格中顯示imageView的屬性
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setLayoutParams(new GridView.LayoutParams(280, 280));

        return imageView;
    }
   }

4.圖片資源:上面程式碼中我們用到了兩張圖片:R.miamap.ic_launcher 和 R.mipmap.image_placeholder(或者R.drawable…),你可以將它們新增進你自己的專案,也可以使用自己的圖片:

5.建立GridImageActivity:我們通過GridImageActivity用來顯示網格圖片:

public class GridImageActivity extends Activity {

    private ImageAdapter adapter;
    private GridView gridView;

    //用來儲存我們需要用到的18個Url地址
    private ArrayList<String> urls=new ArrayList<>();

    private final String baseUrl="http://www.jycoder.com/json/Image/";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gridview);


        gridView= (GridView) findViewById(R.id.grid_view);

        //圖片Url地址
        for(int i=1;i<=18;i++){
            urls.add(baseUrl+i+".jpg");
        }

        adapter=new ImageAdapter(GridImageActivity.this,urls);
        gridView.setAdapter(adapter);

        //為每個網格新增單擊事件監聽,單擊後跳轉到圖片展示頁面MainActivity
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent=new Intent(GridImageActivity.this,MainActivity.class);

                //我們需要傳遞這張圖片的Url地址給MainActivity
                intent.putExtra("imageUrl",urls.get(i));
                startActivity(intent);
            }
        });
    }
    }

5.完成MainActivity**

public class MainActivity extends Activity {

    private ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView= (ImageView) findViewById(R.id.full_image);

        //獲取傳遞過來的imageUrl,並將image顯示出來,注意設定placeholer
        Intent intent=getIntent();
        String imageUrl=intent.getExtras().getString("imageUrl");
        Picasso.with(MainActivity.this).load(imageUrl).placeholder(R.mipmap.image_placholder).error(R.mipmap.ic_launcher).into(imageView);
    }
}

6.改寫Manifest.xml:我們需要新增聯網許可權,還有將GridImageActivity設為啟動Activity,而MainActivity作為圖片具體顯示Activity

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.coder.usepicasso" >
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".GridImageActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity"/>
    </application>
</manifest>

好的,我們的程式碼已經完成了~試著讓它執行起來吧

總結:

通過上面的練習,Picasso的使用已經基本上掌握了,但是我們卻沒有涉及最最重要的一點就是圖片的快取,為什麼沒有寫這一部分呢,因為這部分相對涉及的東西比較多,所以我打算寫另一篇文章具體探討一下Android的快取機制,而不僅僅是在這個框架內討論~~,關注微信公眾號:ITBird,和小夥伴們一起學習一起進步!

參考資料: