MyException - 我的异常网
当前位置:我的异常网» Android » Android Gallery图片展示和文字提示及Menu 菜单

Android Gallery图片展示和文字提示及Menu 菜单

www.MyException.Cn  网友分享于:2013-06-29  浏览:226次
Android Gallery图片显示和文字提示及Menu 菜单

 

Gallery组件主要用于横向显示图像列表,不过按常规做法。Gallery组件只能有限地显示指定的图像。也就是说,如果为Gallery组件指定了10张图像,那么当Gallery组件显示到第10张时,就不会再继续显示了。

代码里带注释,欢迎相互讨论

Layout里的main.xml文件:

 

 

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:background="@drawable/background_port"  
    >  
      
    <ImageButton android:src="@drawable/login"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:id="@+id/login"  
        android:background="#0000"/>  
          
    <com.king.showgallery.GameGallery android:id="@+id/imgGallery"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:layout_centerHorizontal="true"  
        android:layout_alignParentBottom="true"/>  
          
</RelativeLayout>  

 

 res/menu/menu.xml文件:

 

<?xml version="1.0" encoding="UTF-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android">  
    <item android:id="@+id/menu_update" android:title="程序升级" android:icon="@drawable/icon_appupdate"/>  
    <item android:id="@+id/menu_download" android:title="下载中心" android:icon="@drawable/icon_download_center"/>  
    <item android:id="@+id/menu_feedback" android:title="用户反馈" android:icon="@drawable/icon_feedback"/>  
    <item android:id="@+id/menu_recommend" android:title="好友推荐" android:icon="@drawable/icon_recommend"/>  
    <item android:id="@+id/menu_about" android:title="关于我们" android:icon="@drawable/icon_about"/>  
</menu> 

 <item android:id="@+id/menu_about" android:title="关于我们" android:icon="@drawable/icon_about"/>

 

 

id标签,title是当前菜单的描述,icon是当前菜单的图片

 

package com.king.showgallery;  
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.view.View;  
import android.view.Window;  
import android.view.WindowManager;  
import android.widget.AdapterView;  
import android.widget.TextView;  
import android.widget.Toast;  
import android.widget.AdapterView.OnItemClickListener;  
public class GalleryActivity extends MenuActivity {  
    //imgList里装载需要显示的图片  
    private Integer[] imgList={R.drawable.tab_selected_1,R.drawable.tab_selected_1,R.drawable.tab_selected_1,R.drawable.tab_selected_1,R.drawable.tab_selected_1,R.drawable.tab_selected_1,R.drawable.tab_selected_1,R.drawable.tab_selected_1};  
    private Toast toast;  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
          
        //设置全屏  
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);  
        setContentView(R.layout.main);  
          
        ImageAdapter adapter = new ImageAdapter(this, imgList);  
        adapter.createReflectedImages();  
        GameGallery gameGallery = (GameGallery) findViewById(R.id.imgGallery);  
        gameGallery.setAdapter(adapter);  
          
          
        gameGallery.setOnItemClickListener(new OnItemClickListener() {  
            //AdapterView<?> arg0代表向spinner中加载的一系列字符串或其它事物,是一个适配器,是字符串和Spinner之间的桥梁!而View代表Spinner,int arg2代表ItemId, long arg3代表Item的position!  
            public void onItemClick(AdapterView<?> arg0, View view, int position,  
                    long arg3) {  
                switch (position) {  
                case 0:  
                    //点击每个图片,根据图片的position,显示不同的内容  
                    toast.makeText(GalleryActivity.this, "this is zero", Toast.LENGTH_SHORT).show();  
                    break;  
                case 1:  
                    toast.makeText(GalleryActivity.this, "this is one", Toast.LENGTH_SHORT).show();break;  
                case 2:  
                    toast.makeText(GalleryActivity.this, "this is two", Toast.LENGTH_SHORT).show();break;  
                case 3:  
                    toast.makeText(GalleryActivity.this, "this is three", Toast.LENGTH_SHORT).show();break;  
                case 4:  
                    //程序退出事件  
                    Intent startMain = new Intent(Intent.ACTION_MAIN);  
                    startMain.addCategory(Intent.CATEGORY_HOME);  
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
                    startActivity(startMain);  
                    System.exit(0);  
                    break;  
                case 5:  
                    toast.makeText(GalleryActivity.this, "this is five", Toast.LENGTH_SHORT).show();break;  
                case 6:  
                    toast.makeText(GalleryActivity.this, "this is six", Toast.LENGTH_SHORT).show();break;  
                case 7:  
                    toast.makeText(GalleryActivity.this, "this is seven", Toast.LENGTH_SHORT).show();break;  
                default:  
                    break;  
                }  
            }  
        });  
    }  
}  

 对于Android开发我们可以做的尽量MVC化,UI界面和Code逻辑代码分离方式,除了常规的Activity布局可以用xml实现外,菜单Menu也可以通过MenuInflater来映射一个布局文件,相关的创建菜单方法有些不同。

package com.king.showgallery;  
import android.app.Activity;  
import android.content.Context;  
import android.os.Handler;  
import android.util.AttributeSet;  
import android.view.InflateException;  
import android.view.LayoutInflater;  
import android.view.Menu;  
import android.view.MenuInflater;  
import android.view.MenuItem;  
import android.view.View;  
import android.widget.Toast;  
public class MenuActivity extends Activity{  
    public boolean onCreateOptionsMenu(Menu menu){  
        super.onCreateOptionsMenu(menu);  
        //MenuInflater 是用来解析定义在menu 目录下的菜单布局文件  
        MenuInflater inflater=new MenuInflater(getApplicationContext());  
        inflater.inflate(R.menu.menu, menu);  
        return true;  
    }  
      
    public boolean onOptionsItemSelected(MenuItem item){  
        String info="";  
        switch (item.getItemId()) {  
        case R.id.menu_about:  
            //点击当前菜单后显示效果  
            info="isabout";  
            break;  
              
        case R.id.menu_download:  
            info="isdownload";  
            break;  
          
        case R.id.menu_feedback:  
            info="isfeedback";  
            break;  
          
        case R.id.menu_recommend:  
            info="isrecommend";  
            break;  
              
        case R.id.menu_update:  
            info="isupdate";  
            break;  
        default:  
            info="null";  
            break;  
        }  
          
        Toast toast=Toast.makeText(this, info, Toast.LENGTH_SHORT);  
        toast.show();  
        return super.onOptionsItemSelected(item);  
    }  
      
    protected void setMenuBackground(){  
        MenuActivity.this.getLayoutInflater().setFactory(new android.view.LayoutInflater.Factory() {  
              
            @Override  
            public View onCreateView(String name, Context context, AttributeSet attrs) {  
                if(name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")){  
                    try{  
                        LayoutInflater f=getLayoutInflater();  
                        final View view=f.createView(name, null, attrs);  
                        new Handler().post(new Runnable(){  
                            public void run(){  
                                view.setBackgroundResource(R.drawable.menu_background);  
                            }  
                        });  
                        return view;  
                    }catch(InflateException e){  
                        e.printStackTrace();  
                    }catch(ClassNotFoundException e){  
                        e.printStackTrace();  
                    }  
                }  
                return null;  
            }  
        });  
    }  
}  
 

package com.king.showgallery;  
import android.content.Context;  
import android.graphics.Camera;  
import android.graphics.Matrix;  
import android.util.AttributeSet;  
import android.view.View;  
import android.view.animation.Transformation;  
import android.widget.Gallery;  
import android.widget.ImageView;  
public class GameGallery extends Gallery{  
      
    public GameGallery(Context context){  
        super(context);  
        this.setStaticTransformationsEnabled(true);  
    }  
      
    public GameGallery(Context context,AttributeSet attrs){  
        super(context,attrs);  
        this.setStaticTransformationsEnabled(true);  
    }  
    public GameGallery(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
        this.setStaticTransformationsEnabled(true);  
    }  
      
    //mCamera是用来做类3D效果处理,比如z轴方向上的平移,绕y轴的旋转等  
    private Camera mCamera = new Camera();  
      
    //mMaxRotationAngle是图片绕y轴最大旋转角度,也就是屏幕最边上那两张图片的旋转角度  
    private int mMaxRotationAngle = 60;  
      
    //mMaxZoom是图片在z轴平移的距离,视觉上看起来就是放大缩小的效果.  
    private int mMaxZoom = -120;  
      
    private int mCoveflowCenter;  
    public int getMaxRotationAngle() {  
            return mMaxRotationAngle;  
    }  
    public void setMaxRotationAngle(int maxRotationAngle) {  
            mMaxRotationAngle = maxRotationAngle;  
    }  
    public int getMaxZoom() {  
            return mMaxZoom;  
    }  
    public void setMaxZoom(int maxZoom) {  
            mMaxZoom = maxZoom;  
    }  
    private int getCenterOfCoverflow() {  
            return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2  
                            + getPaddingLeft();  
    }  
    private static int getCenterOfView(View view) {  
            return view.getLeft() + view.getWidth() / 2;  
    }  
    protected boolean getChildStaticTransformation(View child, Transformation t) {  
            final int childCenter = getCenterOfView(child);  
            final int childWidth = child.getWidth();  
            int rotationAngle = 0;  
            t.clear();  
            t.setTransformationType(Transformation.TYPE_MATRIX);  
            if (childCenter == mCoveflowCenter) {  
                    transformImageBitmap((ImageView) child, t, 0);  
            } else {  
                    rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);  
                    if (Math.abs(rotationAngle) > mMaxRotationAngle) {  
                            rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle  
                                            : mMaxRotationAngle;  
                    }  
                    transformImageBitmap((ImageView) child, t, rotationAngle);  
            }  
            return true;  
    }  
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
            mCoveflowCenter = getCenterOfCoverflow();  
            super.onSizeChanged(w, h, oldw, oldh);  
    }  
    private void transformImageBitmap(ImageView child, Transformation t,  
                    int rotationAngle) {  
            mCamera.save();  
            final Matrix imageMatrix = t.getMatrix();  
            final int imageHeight = child.getLayoutParams().height;  
            final int imageWidth = child.getLayoutParams().width;  
            final int rotation = Math.abs(rotationAngle);  
            // 在Z轴上正向移动camera的视角,实际效果为放大图片。  
            // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。  
            mCamera.translate(0.0f, 0.0f, 100.0f);  
            // As the angle of the view gets less, zoom in  
            if (rotation < mMaxRotationAngle) {  
                    float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));  
                    mCamera.translate(0.0f, 0.0f, zoomAmount);  
            }  
            // 在Y轴上旋转,对应图片竖向向里翻转。  
            // 如果在X轴上旋转,则对应图片横向向里翻转。  
            mCamera.rotateY(rotationAngle);  
            mCamera.getMatrix(imageMatrix);  
            imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));  
            imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));  
            mCamera.restore();  
    }  
}  
 

package com.king.showgallery;  
import android.content.Context;  
import android.content.res.Resources;  
import android.graphics.Bitmap;  
import android.graphics.Bitmap.Config;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.LinearGradient;  
import android.graphics.Matrix;  
import android.graphics.Paint;  
import android.graphics.PorterDuff.Mode;  
import android.graphics.PorterDuffXfermode;  
import android.graphics.Shader.TileMode;  
import android.graphics.Typeface;  
import android.graphics.drawable.BitmapDrawable;  
import android.graphics.drawable.Drawable;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.BaseAdapter;  
import android.widget.ImageView;  
import android.widget.ImageView.ScaleType;  
public class ImageAdapter extends BaseAdapter{  
    private Context mContext;  
    private Integer[] mImageIds;  
    private ImageView[] mImages;  
    private String[] strings;  
    private int width,height;  
      
    //图片上的提示信息  
    private String[] textList={"功能说明","项目说明","玩法说明","软件说明","退出","程序更新","兑奖","查询"};  
    public ImageAdapter(Context c, Integer[] ImageIds) {  
        mContext = c;  
        mImageIds = ImageIds;  
        mImages = new ImageView[mImageIds.length];  
    }  
    public boolean createReflectedImages() {  
        final int reflectionGap = 4;  
        int index = 0;  
          
        for (int imageId : mImageIds) {  
            Bitmap originalImage = BitmapFactory.decodeResource(mContext  
                    .getResources(), imageId);  
            width = originalImage.getWidth();  
            height = originalImage.getHeight();  
            Matrix matrix = new Matrix();  
//          matrix.setRotate(30);  
            matrix.preScale(1, -1);  
            Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,  
                    height / 2, width, height / 2, matrix, false);  
            Bitmap bitmapWithReflection = Bitmap.createBitmap(width,  
                    (height + height / 2), Config.ARGB_8888);  
            Canvas canvas = new Canvas(bitmapWithReflection);  
            canvas.drawBitmap(originalImage, 0, 0, null);  
            Paint deafaultPaint = new Paint();  
              
            deafaultPaint.setAntiAlias(true);  
            canvas.drawRect(0, height, width, height + reflectionGap,  
                    deafaultPaint);  
            canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);  
            Paint paint = new Paint();  
              
            paint.setAntiAlias(true);  
            LinearGradient shader = new LinearGradient(0,  
                    originalImage.getHeight(), 0,  
                    bitmapWithReflection.getHeight() + reflectionGap,  
                    0x70ffffff, 0x00ffffff, TileMode.CLAMP);  
            paint.setShader(shader);  
            paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));  
            canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()  
                    + reflectionGap, paint);  
            ImageView imageView = new ImageView(mContext);  
            imageView.setImageBitmap(bitmapWithReflection);  
            imageView.setLayoutParams(new GameGallery.LayoutParams(180, 240));  
              
            mImages[index++] = imageView;  
              
              
        }  
        return true;  
    }  
    private Resources getResources() {  
        return null;  
    }  
    public int getCount() {  
        return mImageIds.length;  
    }  
    public Object getItem(int position) {  
        return position;  
    }  
    public long getItemId(int position) {  
        return position;  
    }  
    public View getView(int position, View convertView, ViewGroup parent) {  
        //给图片添加文字提示信息  
        Bitmap newb = Bitmap.createBitmap( width,height, Config.ARGB_8888 );      
        Canvas canvasTemp = new Canvas( newb );      
        canvasTemp.drawColor(Color.alpha(0));      
        Paint p = new Paint();      
        String familyName = "宋体";      
        Typeface font = Typeface.create(familyName, Typeface.BOLD);      
        p.setColor(Color.WHITE);      
        p.setTypeface(font);      
        p.setTextSize(30);      
        canvasTemp.drawText(textList[position], 40,80, p);      
        Drawable drawable = new BitmapDrawable(newb);      
        mImages[position].setBackgroundDrawable(drawable);  
          
        return mImages[position];  
    }  
    public float getScale(boolean focused, int offset) {  
        return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));  
    }  
}  

 ImageAdapter类中有两个非常重要的方法:getCountgetView。其中getCount方法用于返回图像总数,要注意的是,这个总数不能大于图像的实际数(可以小于图像的实际数),否则会抛出越界异常。当Gallery组件要显示某一个图像时,就会调用getView方法,并将当前的图像索引(position参数)传入该方法。一般getView方法用于返回每一个显示图像的组件(ImageView对象)。从这一点可以看出,Gallery组件是即时显示图像的,而不是一下将所有的图像都显示出来。在getView方法中除了创建了ImageView对象,还用从resIds数组中获得了相应的图像资源ID来设置在ImageView中显示的图像。最后还设置了Gallery组件的背景显示风格。




在ImageAdapter里给图片添加文字信息,注意

1.Bitmap,可以来自资源/文件,也可以在程序中创建,实际上的功能相当于图片的存储空间; 

2.Canvas,紧密与Bitmap联系,把Bitmap比喻内容的话,那么Canvas就是提供了众多方法操作Bitamp的平台; 

3.Paint,与Canvas紧密联系,是"画板"上的笔刷工具,也用于设置View控件上的样式; 

4.Drawable,如果说前三者是看不见地在内存中画图,那么Drawable就是把前三者绘图结果表现出来的接口。Drawable多个子类,例如:位图(BitmapDrawable)、图形(ShapeDrawable)、图层(LayerDrawable)等。 

 

文章评论

聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
 程序员的样子
程序员的样子
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
一个程序员的时间管理
一个程序员的时间管理
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
每天工作4小时的程序员
每天工作4小时的程序员
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员应该关注的一些事儿
程序员应该关注的一些事儿
那些争议最大的编程观点
那些争议最大的编程观点
代码女神横空出世
代码女神横空出世
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
旅行,写作,编程
旅行,写作,编程
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
编程语言是女人
编程语言是女人
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
我是如何打败拖延症的
我是如何打败拖延症的
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
10个调试和排错的小建议
10个调试和排错的小建议
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
鲜为人知的编程真相
鲜为人知的编程真相
程序员的鄙视链
程序员的鄙视链
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员必看的十大电影
程序员必看的十大电影
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
漫画:程序员的工作
漫画:程序员的工作
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Java程序员必看电影
Java程序员必看电影
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有