图片浏览器(动画&手势识别&viewflipper&大图加载处理)

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>

 

 

 

 

 

posted @ 2013-06-21 13:15  沿途的景  阅读(364)  评论(0)    收藏  举报