imageviewer
|--src
|--com.ngu.imageviewer
|--MainActivity
|--res
|--anim
|--next_set_in.xml
|--next_set_out.xml
|--pre_set_in.xml
|--pre_set_out.xml
|--layout
|--activity_main.xml
|--AndroidManifest.xml
MainActivity.java
package com.ngu.imageviewer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ViewFlipper;
public class MainActivity extends Activity implements OnClickListener {
protected static final int INIT_BITMAP = 10;
private static ViewFlipper vf;
private Button bt_pre;
private Button bt_next;
private int[] pics;
private ImageView iv = null;
private Bitmap bitmap;
private GestureDetector mGestureDetector;
private ProgressDialog pd;
//private Animation animation;
private static Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case INIT_BITMAP:
ImageView iv = (ImageView) msg.obj;
vf.addView(iv);
break;
}
super.handleMessage(msg);
}
};
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vf = (ViewFlipper) this.findViewById(R.id.vf);
bt_pre = (Button) this.findViewById(R.id.bt_pre);
bt_pre.setOnClickListener(this);
bt_next = (Button) this.findViewById(R.id.bt_next);
bt_next.setOnClickListener(this);
pd = new ProgressDialog(this);
pd.setMessage("请稍候,正在加载图片信息...");
//创建手势识别器
mGestureDetector = new GestureDetector(
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
if (Math.abs(e1.getY() - e2.getY()) > 240) {
System.out.println("竖直方向移动过大");
return true;
}
if (Math.abs(velocityX) < 100) {
System.out.println("滑动速度过慢");
return true;
}
// 自左向右滑动,显示上一个
if (e2.getX() - e1.getX() > 100) {
//animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.tran_out);
//vf.startAnimation(animation);
//Animation inAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.pre_tran_in);
//Animation outAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.pre_tran_out);
Animation inAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.pre_set_in);
Animation outAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.pre_set_out);
vf.setInAnimation(inAnimation);
vf.setOutAnimation(outAnimation);
vf.showPrevious();
return true;
}
// 自右向左滑动,显示下一个
if (e1.getX() - e2.getX() > 100) {
//animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.tran_in);
//vf.startAnimation(animation);
//Animation inAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.next_tran_in);
//Animation outAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.next_tran_out);
Animation inAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.next_set_in);
Animation outAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.next_set_out);
vf.setInAnimation(inAnimation);
vf.setOutAnimation(outAnimation);
vf.showNext();
return true;
}
return super.onFling(e1, e2, velocityX, velocityY);
}
});
pics = new int[] { R.drawable.abraham_lake_sunset,
R.drawable.enchanted_sky_fire, R.drawable.hawaii_volcano_sparks };
pd.show();
new Thread(){
public void run() {
for (int i = 0; i < pics.length; i++) {
DisplayMetrics metrics = new DisplayMetrics();
Resources res = new Resources(MainActivity.this.getAssets(), metrics, null);
Options opts = new Options();
opts.inJustDecodeBounds = true;// 只是获取图片信息(图片头信息-这里只是获取图片的宽高),而不会将图片真正的加载到内存中
BitmapFactory.decodeResource(res, pics[i], opts);//据说使用decodeStream方法高效些,因为此方法内部使用到了jni实现对图片的解析<http://hi.baidu.com/liganggang/item/6ab1e480fa2da1e3e596e015
int width = opts.outWidth;
int height = opts.outHeight;
System.out.println("width:"+width+",height:"+height);
MainActivity.this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int windowwidth = metrics.widthPixels;
int windowheight = metrics.heightPixels;
System.out.println("windowwidth:"+windowwidth+",windowheight:"+windowheight);
int scaleX = width / windowwidth;
int scaleY = height / windowheight;
//水平缩放比比较大
if (scaleX > 1 && scaleX > scaleY) {
opts.inSampleSize = scaleX;
}
//竖直缩放比比较大
if (scaleY > 1 && scaleY > scaleX) {
opts.inSampleSize = scaleY;
}
opts.inJustDecodeBounds = false;//完成对原图的缩放处理后,开始真正的解析图片
bitmap = BitmapFactory.decodeResource(res, pics[i], opts);
iv = new ImageView(MainActivity.this);
iv.setImageBitmap(bitmap);
Message msg = Message.obtain();
msg.obj = iv;
msg.what = INIT_BITMAP;
handler.sendMessage(msg);
}
pd.dismiss();
};
}.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_pre:
vf.showPrevious();
break;
case R.id.bt_next:
vf.showNext();
break;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mGestureDetector.onTouchEvent(event);//使用手势识别器识别当前的手势
return super.onTouchEvent(event);
}
}
next_set_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0" >
</alpha>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromXDelta="100%p"
android:fromYDelta="0%p"
android:toXDelta="0%p"
android:toYDelta="0%p" >
</translate>
</set>
next_set_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0.0" >
</alpha>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromXDelta="0%p"
android:fromYDelta="0%p"
android:toXDelta="-100%p"
android:toYDelta="0%p" >
</translate>
</set>
pre_set_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0" >
</alpha>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromXDelta="-100%p"
android:fromYDelta="0%p"
android:toXDelta="0%p"
android:toYDelta="0%p" >
</translate>
</set>
pre_set_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0.0" >
</alpha>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromXDelta="0%p"
android:fromYDelta="0%p"
android:toXDelta="100%p"
android:toYDelta="0%p" >
</translate>
</set>
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/bt_pre"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/pre" />
<Button
android:id="@+id/bt_next"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/next" />
</LinearLayout>
<ViewFlipper
android:id="@+id/vf"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/ll" >
</ViewFlipper>
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ngu.imageviewer"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.ngu.imageviewer.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>