弹出 图片 可以使用 自定义 Dialog 实现 参考博客 : http://www.cnblogs.com/and_he/archive/2011/09/16/2178716.html多点触摸缩放图片 : http://www.2cto.com/kf/201311/260721.html

解决方案 »

  1.   


    DiaologDemoActivity.java的类,加载图片和重新画图
    public class DiaologDemoActivity extends Activity
    {    private Gallery mGallery;    private LinearLayout ll_viewArea;
        private LinearLayout.LayoutParams parm;
        private ViewArea viewArea;
    //获取图片
        private Integer[] mImage = { R.drawable.guide_page01,
            R.drawable.guide_page02, R.drawable.guide_page03,
            R.drawable.guide_page04 };
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            // 去除title
            requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.main);        mGallery = (Gallery) findViewById(R.id.gallery);
            mGallery.setAdapter(new ImageAdapter(this));
            mGallery.setOnItemClickListener(new OnItemClickListener()
            {
                public void onItemClick(AdapterView parent, View v, int position,
                        long id)
                {
                    Bitmap imageBitmap = drawableToBitmap(getResources().getDrawable(
                        mImage[position]));
                    showImg(imageBitmap);
                }
            });
        }
        private void showImg(Bitmap res)
        {
            // 初始化一个自定义的Dialog
            final CustomDialog.Builder b = new CustomDialog.Builder(this);
            LayoutInflater inflater = LayoutInflater.from(DiaologDemoActivity.this);
            final View view = inflater.inflate(R.layout.progress_dialog, null);        ImageView closeBtn = (ImageView) view.findViewById(R.id.close_btn);        ll_viewArea = (LinearLayout) view.findViewById(R.id.ll_viewArea);
            parm = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT);
            parm.gravity = Gravity.CENTER;        // 自定义布局控件,用来初始化并存放自定义imageView
            viewArea = new ViewArea(DiaologDemoActivity.this, res);        ll_viewArea.addView(viewArea, parm);        b.setView(view);
            b.show();        closeBtn.setOnClickListener(new OnClickListener()
            {            @Override
                public void onClick(View v)
                {
                    b.dismiss();
                }
            });
        }    private class ImageAdapter extends BaseAdapter
        {        private Context mContext;
            public ImageAdapter(Context c)
            {
                mContext = c;
            }
            @Override
            public int getCount()
            {
                return mImage.length;
            }
            @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 i = new ImageView(mContext);
                i.setImageResource(mImage[position]);
                i.setScaleType(ImageView.ScaleType.FIT_XY);
                i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                return i;
            }
        }
        /**
         * Drawable对象转化Bitmap对象
         * @param drawable Drawable对象
         * @return Bitmap对象
         */
        public Bitmap drawableToBitmap(Drawable drawable)
        {        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
                drawable.getIntrinsicHeight(),
                drawable.getOpacity() != PixelFormat.OPAQUE
                        ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
            Canvas canvas = new Canvas(bitmap);
            // canvas.setBitmap(bitmap);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                drawable.getIntrinsicHeight());
            drawable.draw(canvas);
            return bitmap;
        }}
    弹出对话框类CustomDialog.javapublic class CustomDialog extends Dialog
    {    private boolean mCanceledOnTouchOutside = true;
        private boolean mIsMenu;
        protected CustomDialog(Context context, int theme)
        {
            super(context, theme);
        }
        protected CustomDialog(Context context, boolean cancelable,
                OnCancelListener cancelListener)
        {
            super(context, cancelable, cancelListener);
        }
        protected CustomDialog(Context context)
        {
            this(context, R.style.custom_dialog);
        }
        @Override
        public void setContentView(int layoutResID)
        {
            super.setContentView(layoutResID);    }
        @Override
        public void setContentView(View view)
        {
            super.setContentView(view);
        }
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
        }
        /**
         * 捕获系统菜单键响应事件
         */
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)
        {
            if (keyCode == KeyEvent.KEYCODE_MENU && mIsMenu)
            {
                cancel();
            }
            return super.onKeyDown(keyCode, event);
        }
        public boolean onTouchEvent(MotionEvent event)
        {
            if (mCanceledOnTouchOutside
                && event.getAction() == MotionEvent.ACTION_DOWN
                && isOutOfBounds(event))
            {
                cancel();
                return true;
            }        return false;
        }
        private boolean isOutOfBounds(MotionEvent event)
        {
            final int x = (int) event.getX();
            final int y = (int) event.getY();
            final View contentView = findViewById(R.id.content);
            return (x < contentView.getLeft()) || (y < contentView.getTop())
                   || (x > contentView.getRight()) || (y > contentView.getBottom());
        }    public static class Builder
        {        private CustomDialog mDialog;
            private LinearLayout mContent;
            private View customView;
            public Builder(Context context)
            {
                mDialog = new CustomDialog(context);
                mDialog.setContentView(R.layout.custom_dialog);
                LayoutParams params = mDialog.getWindow().getAttributes();
                params.width = LayoutParams.FILL_PARENT;
                params.height = LayoutParams.FILL_PARENT;
                mDialog.getWindow().setAttributes(params);
                mContent = (LinearLayout) mDialog.findViewById(R.id.content);
                mDialog.setCanceledOnTouchOutside(true);
            }
            public void setOnCancelListener(OnCancelListener listener)
            {
                mDialog.setOnCancelListener(listener);
            }
            public void setCanceledOnTouchOutside(boolean flag)
            {
                mDialog.mCanceledOnTouchOutside = flag;
            }
            public void setOnDismissListener(OnDismissListener listener)
            {
                mDialog.setOnDismissListener(listener);
            }
            public void dismiss()
            {
                mDialog.dismiss();
            }
            public void show()
            {
                if (customView != null)
                {
                    mContent.addView(customView);
                }
                mDialog.show();
            }
            public void setView(View view)
            {
                customView = view;
            }
            public void setIsMenu(boolean isMenu)
            {
                mDialog.mIsMenu = isMenu;
            }    }}