您的位置:首页 > 移动开发 > Android开发

Android 广告效果实现(gallery+小圆点)

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

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

运行效果:



布局文件:

[java] view
plaincopy

<FrameLayout  

    android:layout_width="fill_parent"  

    android:layout_height="wrap_content"  

    android:paddingLeft="16dp"  

    android:paddingRight="16dp"  

    android:paddingTop="10dp" >  

  

    <Gallery  

        android:id="@+id/gallery"  

        android:layout_width="fill_parent"  

        android:layout_height="wrap_content"  

        android:fadingEdge="none"  

        android:spacing="0dp" />  

  

    <RelativeLayout  

        android:layout_width="fill_parent"  

        android:layout_height="18dp"  

        android:layout_gravity="bottom"  

        android:layout_marginBottom="3dp"  

        android:layout_marginLeft="3dp"  

        android:layout_marginRight="3dp"  

        android:background="#80776f63"  

        android:gravity="center" >  

  

        <ImageView  

            android:id="@+id/dot_1"  

            android:layout_width="wrap_content"  

            android:layout_height="wrap_content"  

            android:src="@drawable/ic_dot_normal" />  

  

        <ImageView  

            android:id="@+id/dot_2"  

            android:layout_width="wrap_content"  

            android:layout_height="wrap_content"  

            android:layout_marginLeft="10dp"  

            android:layout_toRightOf="@+id/dot_1"  

            android:src="@drawable/ic_dot_normal" />  

  

        <ImageView  

            android:id="@+id/dot_3"  

            android:layout_width="wrap_content"  

            android:layout_height="wrap_content"  

            android:layout_marginLeft="10dp"  

            android:layout_marginRight="10dp"  

            android:layout_toRightOf="@+id/dot_2"  

            android:src="@drawable/ic_dot_normal" />  

    </RelativeLayout>  

</FrameLayout>  

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

[java] view
plaincopy

public class MainActivity extends Activity {  

  

    private Gallery mGallery;  

    private int index = 0;// 记录选中的图片位置  

    private ImageView[] mImageViewIds;// 小圆点ImageView数组  

    private static final int IMAGE_COUNT = 3;// 小圆点个数  

  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

  

        findViews();  

        mImageViewIds[0].setImageDrawable(getBaseContext().getResources()  

                .getDrawable(R.drawable.ic_dot_focused));  

        ImageAdapteradapter = new ImageAdapter(this);  

        mGallery.setAdapter(adapter);  

        Timer timer = new Timer();  

        timer.schedule(task, 2000, 2000);  

        mGallery.setOnItemSelectedListener(onItemSelectedListener);  

        mGallery.setOnItemClickListener(onItemClickListener);  

    }  

  

    private void findViews() {  

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

        mImageViewIds = new ImageView[] { (ImageView) findViewById(R.id.dot_1),  

                (ImageView) findViewById(R.id.dot_2),  

                (ImageView) findViewById(R.id.dot_3) };  

    }  

  

    private TimerTask task = new TimerTask() {  

  

        @Override  

        public void run() {  

            Message message = new Message();  

            message.what = 2;  

            index = mGallery.getSelectedItemPosition();  

            index++;  

            handler.sendMessage(message);  

        }  

    };  

  

    /** 

     * 开一个线程执行耗时操作 

     */  

    private Handler handler = new Handler() {  

  

        @Override  

        public void handleMessage(Message msg) {  

            super.handleMessage(msg);  

            switch (msg.what) {  

            case 2:  

                mGallery.setSelection(index);  

                break;  

            default:  

                break;  

            }  

        }  

  

    };  

    /** 

     * 设置小圆点显示,position会一直增加,如果要循环显示图片,需要对position取余,否则数组越界 

     */  

    private OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {  

  

        @Override  

        public void onItemSelected(AdapterView<?> parent, View view,  

                int position, long id) {  

            int pos = position % IMAGE_COUNT;  

            mImageViewIds[pos].setImageDrawable(getBaseContext().getResources()  

                    .getDrawable(R.drawable.ic_dot_focused));  

            if (pos > 0) {  

                mImageViewIds[pos - 1].setImageDrawable(getBaseContext()  

                        .getResources().getDrawable(R.drawable.ic_dot_normal));  

            }  

            if (pos < (IMAGE_COUNT - 1)) {  

                mImageViewIds[pos + 1].setImageDrawable(getBaseContext()  

                        .getResources().getDrawable(R.drawable.ic_dot_normal));  

            }  

            if (pos == 0) {  

                mImageViewIds[IMAGE_COUNT - 1]  

                        .setImageDrawable(getBaseContext().getResources()  

                                .getDrawable(R.drawable.ic_dot_normal));  

            }  

        }  

  

        @Override  

        public void onNothingSelected(AdapterView<?> arg0) {  

            // TODO Auto-generated method stub  

  

        }  

    };  

  

    /** 

     * 点击事件,点击图片进入SecondActivity 

     */  

    private OnItemClickListener onItemClickListener = new OnItemClickListener() {  

  

        @Override  

        public void onItemClick(AdapterView<?> arg0, View arg1, int pos,  

                long arg3) {  

            Intent intent = new Intent();  

            intent.setClass(MainActivity.this, SecondActivity.class);  

            startActivity(intent);  

        }  

    };  

}  

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

[java] view
plaincopy

public class ImageAdapter extends BaseAdapter {  

    private Context context;  

    private int[] mImages = { R.drawable.bg_timeline_01,  

            R.drawable.bg_timeline_02, R.drawable.bg_timeline_03 };  

    private static final int IMAGE_PX_HEIGHT = 198;  

  

    public ImageAdapter(Context context) {  

        this.context = context;  

    }  

  

    @Override  

    public int getCount() {  

        return Integer.MAX_VALUE;//实现循环显示  

    }  

  

    @Override  

    public Object getItem(int position) {  

        return position;  

    }  

  

    @Override  

    public long getItemId(int position) {  

        return position;  

    }  

  

    @Override  

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

        ImageView imageView = new ImageView(context);  

        imageView.setImageResource(mImages[position % mImages.length]);  

        imageView.setScaleType(ImageView.ScaleType.CENTER);  

        imageView.setLayoutParams(new Gallery.LayoutParams(  

                Gallery.LayoutParams.FILL_PARENT, IMAGE_PX_HEIGHT));  

  

        RelativeLayout borderImg = new RelativeLayout(context);  

        borderImg.setPadding(2, 2, 2, 2);  

        borderImg.setBackgroundResource(R.drawable.bg_gallery);//设置ImageView边框  

        borderImg.addView(imageView);  

        return borderImg;  

    }  

  

}  

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

[java] view
plaincopy

int mGalleryItemBackground;  

private Context mContext;  

   

public ImageAdapter(Context context)  

{  

mContext = context;  

// 获得Gallery组件的属性  

TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);  

mGalleryItemBackground = typedArray.getResourceId(  

R.styleable.Gallery_android_galleryItemBackground, 0);   

}  

在getview中设置

[java] view
plaincopy

imageView.setBackgroundResource(mGalleryItemBackground);  

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

[java] view
plaincopy

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

<resources>  

<declare-styleable name="Gallery">  

<attr name="android:galleryItemBackground" />  

</declare-styleable>  

</resources>  

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

自定义边框参考http://stackoverflow.com/questions/4830173/change-border-style-in-gallery
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: