AndroidGUI19:Gallery常用技巧

    技术2022-06-09  44

    Gallery AdapterView 的派生类, AdapterView ViewGroup 的派生类, ViewGroup View 的派生类。

     

    什么是 Gallery ?官方的说法是:

    A view that shows items in a center-locked, horizontally scrolling list. 这句话包含以下几个意思:

    +      Gallery 是一种 View ,可以用于显示条目 (item)

    +       Garllery 是中心锁定的 ( 即被点击的 item 总是处于 Gallery 对象的中央 ) ,并可以水平滚动的列表

     

    在实际使用中,通常用 Gallery 来显示图片 ( 当然也可以显示文字 )

     

    下面用一个简单例子来说明 Gallery 的用法。

    1.     创建一个项目,修改 main.xml ,使之如下:

    <? xml version = "1.0" encoding = "utf-8" ?>

    < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"

        android:orientation = "vertical"

        android:layout_width = "fill_parent"

        android:layout_height = "fill_parent"

        >

            

             <!-- 增加一个 Gallery 对象 -->

             < Gallery

                       android:id = "@+id/gallery"

                       android:layout_width = "fill_parent"

                       android:layout_height = "wrap_content"

             />

    </ LinearLayout >

     

    2.     res/drawable-mdpi 文件夹,拖入以下图片 ( 均为 png 格式,图像的实际大小为 256 x 256)

    它们对应的文件名 ( 未加 ”.png” 后缀 ) ,分别为:

    al, ar, au, ba, cf, cn, eu, fa, hk, in, ma, pk, ru, uk, us

    大家做实验的时候,可以选择自己喜欢的图片。

     

    3.     创建一个自定义的 Adapter 类: ImageAdapter ,使之继承 BaseAdapter ,代码如下:

    package com.pat.gui;

     

    import android.content.Context;

    import android.view.View;

    import android.view.ViewGroup;

    import android.widget.BaseAdapter;

    import android.widget.Gallery;

    import android.widget.ImageView;

     

    public class ImageAdapter extends BaseAdapter

    {

             private Context ctx ;

             private int [] images =

             {

                       R.drawable. al ,           // Algeria

                       R.drawable. ar ,           // Argentina

                       R.drawable. au ,          // Austrilia

                       R.drawable. ba ,          // Bangladesh

                       R.drawable. cf ,            // Swizterland

                       R.drawable. cn ,          // China

                       R.drawable. eu ,          // European Union

                       R.drawable. fa ,           // France

                       R.drawable. hk ,          // Hong Kong

                       R.drawable. in ,           // India

                       R.drawable. ma ,         // Macau

                       R.drawable. pk ,          // Pakistan

                       R.drawable. ru ,           // Russia

                       R.drawable. uk ,          // United Kingdom

                       R.drawable. us            // United States

             };

            

             public ImageAdapter(Context ctx)

             {

                       this . ctx = ctx;

             }

            

             //@Override

             public int getCount()

             {

                       return images . length ;

             }

            

             //@Override

             public Object getItem( int position)

             {

                       return images [position];

             }

     

             //@Override

             public long getItemId( int position)

             {

                       return images [position];

             }

     

             //@Override

             public View getView( int position, View convertView, ViewGroup parent)

             {

                       // convertView 赋给 view

                       ImageView view = (ImageView) convertView;

                      if (view == null )                             // 如果 view 为空

                       {

                                view = new ImageView( ctx );     // 就新建一个

                       }

                       // 否则就是用已经存在的 convertView

                       // 上面做法可以大幅度提高程序运行性能 也可以减少内存的使用 尤其在 Gallery 对象

                       // 中有很多 item 的时候

                      

                       // 设定显示图片

                       view.setImageResource( images [position]);

                      

                       // 设定每个图片的显示大小

                       view.setLayoutParams( new Gallery.LayoutParams(48, 48));

                       //view.setScaleType(ImageView.ScaleType.FIT_XY);        // 这个是维持图片原始大小

                       // 设定图片缩放:即在上面规定的大小中进行显示,并且居中

                       view.setScaleType(ImageView.ScaleType. CENTER_INSIDE );

                      

                       return view;

             }

     

    }

     

    4.     修改 Activity 所对应的代码,使之如下:

    package com.pat.gui;

     

    import android.app.Activity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.AdapterView;

    import android.widget.Gallery;

    import android.widget.Toast;

    import android.widget.AdapterView.OnItemClickListener;

     

    public class ControlGallery extends Activity

    implements

    OnItemClickListener

    {

             private Gallery gallery ;

        @Override

        public void onCreate(Bundle savedInstanceState)

        {

            super .onCreate(savedInstanceState);

            setContentView(R.layout. main );

           

            // 创建一个 ImageAdapter 对象

            ImageAdapter adapter = new ImageAdapter( this );

            // 获取在 main.xml 中定义的 Gallery 对象

            gallery = (Gallery) this .findViewById(R.id. gallery );

            // 设定图片之间的间隔 ( 如果无下面的语句,有时候图片会重叠 )

            gallery .setSpacing(0);

            // adapter gallery 关联起来

            gallery .setAdapter( adapter );

            // gallery 设定 OnItemClickListener

            gallery .setOnItemClickListener( this );

           

        }

             public void onItemClick(AdapterView<?> parent, View view, int position, long id)

             {

                       Toast.makeText ( this , "Position = " + position, Toast. LENGTH_SHORT ).show();

             }

    }

     

    运行结果:

    向左滚动:

    点击中国的国旗:

    可以看到中国的国旗,现在位于中央,同时下面给出了它在什么位置。

     

    下面我现有的基础上,做如下改变:

    +       Layout 上增加一个 ImageView ,用来显示原始图片的大小 (256 x 256)

    +       不再用 Toast 来显示相关选择的信息,而是选择在 Layout 上增加一个 TextView 代替之

    下面是具体的步骤:

     

    5.     修改 main.xml ,使之如下:

    <? xml version = "1.0" encoding = "utf-8" ?>

    < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"

        android:orientation = "vertical"

        android:layout_width = "fill_parent"

        android:layout_height = "fill_parent"

        >

            

             <!-- Gallery 对象之上,增加一个 ImageView 对象 -->

             < ImageView

                       android:id = "@+id/image_view"

                       android:layout_width = "fill_parent"

                       android:layout_height = "wrap_content"

             />

            

             <!-- 增加一个 Gallery 对象 -->

             < Gallery

                       android:id = "@+id/gallery"

                       android:layout_width = "fill_parent"

                       android:layout_height = "wrap_content"

             />

            

             <!-- Gallery 下面增加一个 TextView -->

             < TextView

                       android:id = "@+id/country_name"

                       android:layout_width = "fill_parent"

                       android:layout_height = "wrap_content"

                       android:gravity = "center_horizontal"

                       android:textSize = "26px"

                       android:textColor = "#FF0"

                       android:paddingTop = "10px"

             />

    </ LinearLayout >

    注意,粗体字部分是在原来的基础上增加的。

     

    6.     修改 strings.xml ,使之如下:

    <? xml version = "1.0" encoding = "utf-8" ?>

    < resources >

        < string name = "hello" > Hello World, ControlGallery! </ string >

        < string name = "app_name" > AndroidGUINinteen </ string >

       

        < string name = "al" > Algeria </ string >

        < string name = "ar" > Argentina </ string >

        < string name = "au" > Austrilia </ string >

        < string name = "ba" > Bangladesh </ string >

        < string name = "cf" > Switzerland </ string >

        < string name = "cn" > China </ string >

        < string name = "eu" > European Union </ string >

             < string name = "fa" > France </ string >

             < string name = "hk" > Hong Kong </ string >

             < string name = "in" > India </ string >

             < string name = "ma" > Macau </ string >

             < string name = "pk" > Pakistan </ string >

             < string name = "ru" > Russia </ string >

             < string name = "uk" > United Kingdom </ string >

             < string name = "us" > United States </ string >

    </ resources >

    注意,粗体字部分是在原来的基础上增加的。

     

    7.     修改自定义的 Adapter ,使之如下:

    package com.pat.gui;

     

    import android.content.Context;

    import android.view.View;

    import android.view.ViewGroup;

    import android.widget.BaseAdapter;

    import android.widget.Gallery;

    import android.widget.ImageView;

     

    public class ImageAdapter extends BaseAdapter

    {

             private Context ctx ;

             private int [] images =

             {

                       R.drawable. al ,           // Algeria

                       R.drawable. ar ,           // Argentina

                       R.drawable. au ,          // Austrilia

                       R.drawable. ba ,          // Bangladesh

                       R.drawable. cf ,            // Swizterland

                       R.drawable. cn ,          // China

                       R.drawable. eu ,          // European Union

                       R.drawable. fa ,           // France

                       R.drawable. hk ,          // Hong Kong

                       R.drawable. in ,           // India

                       R.drawable. ma ,         // Macau

                       R.drawable. pk ,          // Pakistan

                       R.drawable. ru ,           // Russia

                       R.drawable. uk ,          // United Kingdom

                       R.drawable. us            // United States

             };

            

             private int [] names =

             {

                       R.string. al ,

                       R.string. ar ,

                       R.string. au ,

                       R.string. ba ,

                       R.string. cf ,

                       R.string. cn ,

                       R.string. eu ,

                       R.string. fa ,

                       R.string. hk ,

                       R.string. in ,

                       R.string. ma ,

                       R.string. pk ,

                       R.string. ru ,

                       R.string. uk ,

                       R.string. us

             };

            

             public ImageAdapter(Context ctx)

             {

                       this . ctx = ctx;

             }

            

             //@Override

             public int getCount()

             {

                       return images . length ;

             }

            

             //@Override

             public Object getItem( int position)

             {

                       return images [position];

             }

     

             //@Override

             public long getItemId( int position)

             {

                       return images [position];

             }

     

             public long getNameId( int position)

             {

                       return names [position];

             }

            

             //@Override

             public View getView( int position, View convertView, ViewGroup parent)

             {

                       // convertView 赋给 view

                       ImageView view = (ImageView) convertView;

                       if (view == null )                             // 如果 view 为空

                       {

                                view = new ImageView( ctx );     // 就新建一个

                       }

                       // 否则就是用已经存在的 convertView

                       // 上面做法可以大幅度提高程序运行性能 也可以减少内存的使用 尤其在 Gallery 对象

                       // 中有很多 item 的时候

                      

                       // 设定显示图片

                       view.setImageResource( images [position]);

                      

                       // 设定每个图片的显示大小

                       view.setLayoutParams( new Gallery.LayoutParams(48, 48));

                       //view.setScaleType(ImageView.ScaleType.FIT_XY);        // 这个是维持图片原始大小

                       // 设定图片缩放:即在上面规定的大小中进行显示,并且居中

                       view.setScaleType(ImageView.ScaleType. CENTER_INSIDE );

                      

                       return view;

             }

    }

    注意,粗体字部分是在原来的基础上增加的。

     

    8.     修改 Activity 所对应的代码,使之如下:

    package com.pat.gui;

     

    import android.app.Activity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.AdapterView;

    import android.widget.Gallery;

    import android.widget.ImageView;

    import android.widget.TextView;

    import android.widget.AdapterView.OnItemClickListener;

     

    public class ControlGallery extends Activity

    implements

    OnItemClickListener

    {

             private Gallery gallery ;

             private ImageAdapter adapter ;

            

             private ImageView image_view ;

             private TextView country_name ;

            

        @Override

        public void onCreate(Bundle savedInstanceState)

        {

            super .onCreate(savedInstanceState);

            setContentView(R.layout. main );

           

            image_view = (ImageView) this .findViewById(R.id. image_view );

            country_name = (TextView) this .findViewById(R.id. country_name );

           

            // 创建一个 ImageAdapter 对象

            adapter = new ImageAdapter( this );

            // 获取在 main.xml 中定义的 Gallery 对象

            gallery = (Gallery) this .findViewById(R.id. gallery );

            // 设定图片之间的间隔 ( 如果无下面的语句,有时候图片会重叠 )

            gallery .setSpacing(0);

            // adapter gallery 关联起来

            gallery .setAdapter( adapter );

            // gallery 设定 OnItemClickListener

            gallery .setOnItemClickListener( this );

           

            // 创建 Activity 时,显示 adapter 中的第一个 item 的图片以及对应的文本

            image_view .setImageResource(( int ) adapter .getItemId(0));

            country_name .setText( this .getString(( int ) adapter .getNameId(0)));

           

        }

       

             public void onItemClick(AdapterView<?> parent, View view, int position, long id)

             {

                       image_view .setImageResource(( int ) adapter .getItemId(position));

                       country_name .setText( this .getString(( int ) adapter .getNameId(position)));

                       //Toast.makeText(this, "Position = " + position, Toast.LENGTH_SHORT).show();

             }

    }

    注意,粗体字部分是在原来的基础上增加的。

     

    运行结果:

    Gallery 向左滚动,并寻则中国的国旗,得到的结果如下:

     


    最新回复(0)