Android特效之一-Gallery应用

/*
    1.ShowAcitivity可以为MainActivity
    2.ImageAdapterGeneral为Gallery对应的图片的处理类
    3.show.xml为对应的布局文件
    4.GalleryFlow为一个继承Gallery的自己实现的类
    5.menu.xml为对应的菜单布局文件


package com.wal.activity;



import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.wal.control.GalleryFlow;
import com.wal.control.ImageAdapterGeneral;
import com.wal.controlclass.Preview;

/**
 * @author jace
 * 
 * Function:
 *  		1.实现读取照片,并显示到页面的ImageView上
 *  
 *  		2.实现Gallery特效图片显示,并实现对应的图片操作链接
 *
 */

public class ShowAcitivity extends Activity{
	private byte[] mbyte;
	private Bitmap mBitmap;
	private ImageView mImageView;
	private GalleryFlow mGallery;
	private Matrix mMatrix;
	private static String dirPath;
	private static EditText receiverText;
	private static EditText picSubjectText;
	private TextView mTextViewForOperation;
	
	static Intent intent = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
//		//实现照相相片翻转
//		ShowAcitivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
		

		// 设置全屏模式
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
				WindowManager.LayoutParams.FLAG_FULLSCREEN); 
					
		// 去除标题栏
		requestWindowFeature(Window.FEATURE_NO_TITLE); 
		
		//显示布局
		setContentView(R.layout.show);

		//获取ImageView对象
		mImageView = (ImageView)findViewById(R.id.mImageView);
		
		//获取TextView对象
		mTextViewForOperation = (TextView)findViewById(R.id.mTextViewPicOperation);
		
		//取得需要显示在ImageView的照片的名字
		String strdirValue = Preview.picName;
		//设置需要读取的照片的路径
		dirPath = "/sdcard/Myphotos/" + strdirValue + ".jpg";
		
		//将指定路径的照片显示到ImageView上
		mImageView.setImageBitmap(getBitmapFromSDcard(dirPath));

//		mProgressDialog.cancel();
//		TakePicActivity mTakePicActivity = new TakePicActivity();
//		mTakePicActivity.mProgressDialog.cancel();
//		System.out.println("销毁ProgressDialog");
		
		System.out.println("Ok------");
		
		//取得并显示提供操作的Gallery的操作列表
		ImageAdapterGeneral mImageAdapterGeneral = new ImageAdapterGeneral(ShowAcitivity.this);
//	     ImageAdapter mImageAdapterGeneral = new ImageAdapter(this, ConstantOrVariable.imagesForOperation);
//	     mImageAdapterGeneral.createReflectedImages();
        
		mGallery = (GalleryFlow)findViewById(R.id.mGallery);		
		mGallery.setAdapter(mImageAdapterGeneral);
		mGallery.setSelection(2);
		
		//设置mGallery操作列表的事件监听
		mGallery.setOnItemClickListener(picClickListener);
		
		//设置mGallery操作提示列表的事件监听
		mGallery.setOnItemSelectedListener(operationClickListener);
		
		System.out.println("------end------");
	}
	
	
	/* 读取sdcard上面的指定目录下的图片 */
    public Bitmap getBitmapFromSDcard(String dir){
    	if(dir == null || dir.equals("")){
    		System.out.print("---null---");
    		return null;
    	}
    	File file  = new File(dir);
    	FileInputStream is = null;
    	try {
			is  = new FileInputStream(file);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    	mBitmap = BitmapFactory.decodeStream(is);
    	
    	//获取显示屏幕的解析像素大小
    	int screenXY[] = new int[2];
    	screenXY = getDisplayXY();
    	
    	if(mBitmap != null){
    		//获取读取到的图片的宽高信息
    		int width = mBitmap.getWidth();
    		int height = mBitmap.getHeight();
    	
    		//如果读取的图片像素超过屏幕的大小,就按照指定的比例进行处理
    		if(width > screenXY[0] && height > screenXY[1]){
    			int newWidth = screenXY[0];
    			int newHeight = screenXY[1];
    		
    			float scaleWidth = ((float)newWidth) / width;
    			float scaleHeight = ((float)newHeight) /height;
    			float minScale = Math.min(scaleWidth, scaleHeight);
    			float maxScale = Math.max(scaleWidth, scaleHeight);
    		
    			mMatrix = new Matrix();
    			mMatrix.postScale(maxScale, minScale);
    		
    			mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, width, height, mMatrix, true);
    		}
    		
    	}else{
    		Toast.makeText(ShowAcitivity.this,"获取的Bitmap 为空 ", 
		            Toast.LENGTH_SHORT).show();
    		System.out.println("Bitmap ---> null");
    	}
    	
    	return mBitmap;
    }
    
    /* 取得手机屏幕的解析像素 */
    public int[] getDisplayXY(){
    	int[] screenXY = new int[2];
    	
    	DisplayMetrics mDisplayMetrics = new DisplayMetrics();
    	getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
    	screenXY[0] = mDisplayMetrics.widthPixels;
    	screenXY[1] = mDisplayMetrics.heightPixels;
    	
    	for(int i = 0; i < 2; i++){
    		System.out.println("screen = "  + screenXY[i]) ;
    	}
    	return screenXY;
    }
    
    //mGallery中单一图片对应的操作链接
    private OnItemClickListener picClickListener = new OnItemClickListener() {

		public void onItemClick(AdapterView<?> arg0, View arg1, int position,
				long arg3) {
			// TODO Auto-generated method stub
			
			switch (position) {
			case 0:
				Toast.makeText(ShowAcitivity.this,"你开启了第 "+(position+1)+" 项操作", 
			            Toast.LENGTH_SHORT).show();
				ShowAcitivity.this.finish();
				//后退,返回相机状态
//				System.exit(0);
				
				break;
				
			case 1:
				Toast.makeText(ShowAcitivity.this,"你开启了第 "+(position+1)+" 项操作", 
			            Toast.LENGTH_SHORT).show();
				break;
				
			case 2:
				Toast.makeText(ShowAcitivity.this,"你开启了第 "+(position+1)+" 项操作", 
			            Toast.LENGTH_SHORT).show();
				
//				File file  = new File("/sdcard/Myphotos/m.jpg");
//				File file = new File("/sdcard/xiaowei.mp3");
				File file = new File(dirPath);
				intent = new Intent(Intent.ACTION_SEND);
				
				//设置邮件主题
//				intent.putExtra("subject", file.getName());
				
				//设置邮件内容
				intent.putExtra("body", "android123-amail sender");
				
				//设置邮件接收人
//				intent.putExtra("to", "[email protected]");
				
				//设置邮件发送的附件
				intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
				
				//设置附件文件类型
				intent.setType("application/octet-stream");
				
				showDialogForUser();
				
				break;
			case 3:
				Toast.makeText(ShowAcitivity.this,"你开启了第 "+(position+1)+" 项操作", 
			            Toast.LENGTH_SHORT).show();
				break;
				
			case 4:
				Toast.makeText(ShowAcitivity.this,"你开启了第 "+(position+1)+" 项操作", 
			            Toast.LENGTH_SHORT).show();
				break;
			
			}
		}
	};

	//mGllery中单一图片对应的操作的提示
	private OnItemSelectedListener operationClickListener = new OnItemSelectedListener() {

		public void onItemSelected(AdapterView<?> arg0, View arg1, int position,
				long arg3) {
			switch (position) {
			case 0:
				mTextViewForOperation.setText("后退");
				break;

			case 1:
				mTextViewForOperation.setText("编辑照片");
				break;
				
			case 2:
				mTextViewForOperation.setText("Email-发送照片");
				break;
				
			case 3:
				mTextViewForOperation.setText("深度编辑");
				break;
				
			case 4:
				mTextViewForOperation.setText("短信发送照片");
				break;
			}
		}

		public void onNothingSelected(AdapterView<?> arg0) {
			// TODO Auto-generated method stub
			
		}
	};
	
	
	
	
	/* 点击传送邮件信息操作,激发的事件处理 */
	private void showDialogForUser(){
		
		
		
		LayoutInflater mLayoutInflater = LayoutInflater.from(ShowAcitivity.this);
		
		final View DialogView = mLayoutInflater.inflate(R.layout.dialog, null);
		
		receiverText = (EditText)DialogView.findViewById(R.id.receiverEditText);
		picSubjectText = (EditText)DialogView.findViewById(R.id.subjectEditText);
		
		//创建对话框
		AlertDialog mAlertDialog = new AlertDialog.Builder(ShowAcitivity.this)
					.setTitle("请填写...")
					.setView(DialogView)
					.setPositiveButton(R.string.sure, new DialogInterface.OnClickListener() {
						
						public void onClick(DialogInterface dialog, int which) {
							//设置邮件接收人
//							System.out.println("receiver --- " + receiverText.getText().toString());
							intent.putExtra("to", receiverText.getText().toString());
//							intent.putExtra("to", "[email protected]");
							
							//设置邮件主题
							intent.putExtra("subject", picSubjectText.getText().toString());
							
							
							startActivity(intent);
							
						}
					})
					.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
						
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated metmAlertDialog.cancel();
//							mAlertDialog.dismiss();
						}
					})
					.create();
		//显示mAlertDialog
		mAlertDialog.show();
		
		
	}


	
	/* 创建ShowActivity页面的菜单 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater mMenuInflater = getMenuInflater();
		
		//设置menu界面为menu01.xml
		mMenuInflater.inflate(R.menu.menu01, menu);
		
		System.out.println(" Menu-----");
		return true;
	}
	
	/* 处理菜单事件 */


	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		//获取当前选中的MenuItem的ID
		int itemId = item.getItemId();
		
		switch (itemId) {
		case R.id.explain:
			
			break;

		case R.id.exitShow:
			android.os.Process.killProcess(android.os.Process.myPid());
			System.exit(0);
			break;
		}
		
		return true;
	}
}











/——————————————————————————————————————/


package com.wal.control;

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 ImageAdapterGeneral extends BaseAdapter{
	private Context context;
	public ImageAdapterGeneral(Context context) {
		this.context = context;
	}

	//获取图片个数
	public int getCount() {
		// TODO Auto-generated method stub
		return ConstantOrVariable.imagesForOperation.length;
	}

	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		
		ImageView mImageView = new ImageView(context);
		
		//给ImageView 设置资源
		mImageView.setImageResource(ConstantOrVariable.imagesForOperation[position]);
		
		//设置布局图片的大小
		mImageView.setLayoutParams(new Gallery.LayoutParams(200, 130));
		
		//设置显示比例的类型
		mImageView.setScaleType(ImageView.ScaleType.FIT_XY);
		
		//设置图片的透明度
		mImageView.setAlpha(150);
		
		//设置每张图片之间的左上右下的相隔参数
		mImageView.setPadding(26, 0, 26, 0);
		
		return mImageView;
	}

}


/********************************************************/
<?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">
   	<ImageView 
   		android:id="@+id/mImageView"
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent" 	
    	>
   	</ImageView>
	<com.wal.control.GalleryFlow 
		android:id="@+id/mGallery"
		
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_alignParentBottom="true"
		/>
	<TextView 
		android:id="@+id/mTextViewPicOperation"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:textSize="30sp"
		android:textColor="#CCFF99"
		android:gravity="center"
		android:layout_alignParentTop="true"
		android:background="@drawable/gallerybackground"
		/>
</RelativeLayout>




/***************************************************************/

package com.wal.control;

import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Transformation;
import android.widget.Gallery;
import android.widget.ImageView;

public class GalleryFlow extends Gallery {

    /**
     * Graphics Camera used for transforming the matrix of ImageViews
     * 
     * \u037c\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdImageViews\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd
     */
    private Camera mCamera = new Camera();

    /**
     * The maximum angle the Child ImageView will be rotated by
     * 
     * \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05ea
     */
    private int mMaxRotationAngle = 60;

    /**
     * The maximum zoom on the centre Child
     * 
     * \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0135\ufffd\ufffd\ufffd\ufffd\u0174\ufffd\u0427\ufffd\ufffd
     */
    private int mMaxZoom = -120;

    /**
     * The Centre of the Coverflow
     * 
     * Coverflow\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd
     */
    private int mCoveflowCenter;

    public GalleryFlow(Context context) {
            super(context);
            this.setStaticTransformationsEnabled(true);
    }

    public GalleryFlow(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.setStaticTransformationsEnabled(true);
    }

    public GalleryFlow(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            this.setStaticTransformationsEnabled(true);
    }

    /**
     * Get the max rotational angle of the image
     * 
     * \ufffd\ufffd\u05ea\ufffd\u01f6\u0235õ\ufffd\ufffd\ufffd\ufffd\ufffd\u04f0\ufffd\ufffd
     * 
     * @return the mMaxRotationAngle
     */
    public int getMaxRotationAngle() {
            return mMaxRotationAngle;
    }

    /**
     * Set the max rotational angle of each image
     * 
     * \u03aaÿ\u04bb\ufffd\ufffd\u037c\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05ea\ufffd\u01f6\ufffd
     * 
     * @param maxRotationAngle
     *            the mMaxRotationAngle to set
     */
    public void setMaxRotationAngle(int maxRotationAngle) {
            mMaxRotationAngle = maxRotationAngle;
    }

    /**
     * Get the Max zoom of the centre image
     * 
     * @return the mMaxZoom
     */
    public int getMaxZoom() {
            return mMaxZoom;
    }

    /**
     * Set the max zoom of the centre image
     * 
     * @param maxZoom
     *            the mMaxZoom to set
     */
    public void setMaxZoom(int maxZoom) {
            mMaxZoom = maxZoom;
    }

    /**
     * Get the Centre of the Coverflow
     * 
     * @return The centre of this Coverflow.
     */
    private int getCenterOfCoverflow() {
            return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2
                            + getPaddingLeft();
    }

    /**
     * Get the Centre of the View
     * 
     * @return The centre of the given view.
     */
    private static int getCenterOfView(View view) {
            return view.getLeft() + view.getWidth() / 2;
    }

    /**
     * {@inheritDoc}
     * 
     * @see #setStaticTransformationsEnabled(boolean)
     */
    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;
    }

    /**
     * This is called during layout when the size of this view has changed. If
     * you were just added to the view hierarchy, you're called with the old
     * values of 0.
     * 
     * @param w
     *            Current width of this view.
     * @param h
     *            Current height of this view.
     * @param oldw
     *            Old width of this view.
     * @param oldh
     *            Old height of this view.
     */
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            mCoveflowCenter = getCenterOfCoverflow();
            super.onSizeChanged(w, h, oldw, oldh);
    }

    /**
     * Transform the Image Bitmap by the Angle passed
     * 
     * @param imageView
     *            ImageView the ImageView whose bitmap we want to rotate
     * @param t
     *            transformation
     * @param rotationAngle
     *            the Angle by which to rotate the Bitmap
     */
    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);

            // \ufffd\ufffdZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u01b6\ufffdcamera\ufffd\ufffd\ufffd\u04fd\u01e3\ufffd\u02b5\ufffd\ufffd\u0427\ufffd\ufffd\u03aa\ufffd\u0174\ufffd\u037c\u01ac\ufffd\ufffd
            // \ufffd\ufffd\ufffd\ufffd\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\u01b6\ufffd\ufffd\ufffd\ufffd\ufffd\u037c\u01ac\ufffd\ufffd\ufffd\ufffd\ufffd\u01b6\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\u03f6\ufffd\u04e6\u037c\u01ac\ufffd\ufffd\ufffd\ufffd\ufffd\u01b6\ufffd\ufffd\ufffd
            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);
            }

            // \ufffd\ufffdY\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05ea\ufffd\ufffd\ufffd\ufffd\u04e6\u037c\u01ac\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufded\u05ea\ufffd\ufffd
            // \ufffd\ufffd\ufffd\ufffd\ufffdX\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd\u04e6\u037c\u01ac\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufded\u05ea\ufffd\ufffd
            mCamera.rotateY(rotationAngle);
            mCamera.getMatrix(imageMatrix);
            imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));
            imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));
            mCamera.restore();
    }

	
    @Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
//		return super.onFling(e1, e2, velocityX, velocityY);
    	return false;
	}
} 


/******************************************************************/
<?xml version="1.0" encoding="utf-8"?>
<menu
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
    	android:id="@+id/explain"
    	android:title="@string/explain"
    	/>
    <item 
    	android:id="@+id/exitShow"
    	android:title="@string/exitout"
    	/>
</menu>





/************************/
备注:由于部分文件,是我原来在Windows下的环境写的,后面导进Linux下的环境了,
变了乱码,不过安写都是部分的注释,应该没什么问题!
Gallery带有倒影,透明等效果,希望与大家交流下....
由于这是个人项目中的部分,功能可能会牵涉到其他一些相关内容,
只要自己变通下,就可以的了


感谢....支持........

你可能感兴趣的:(透明,倒影,特效,gallery)