码迷,mamicode.com
首页 > 移动开发 > 详细

19_Android中图片加载到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写

时间:2015-07-19 00:13:40      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:

??

1  场景:一张图片很大,放到手机上时需要对图片资源进行压缩以及缩放,编写如下界面的案例:

技术分享

2 操作:当点击加载图片到内存时,图片从自己的手机sd卡中取到并显示。

3 ADT开发时,手机连接上电脑后,在Android开发工具中的”FileExplorer”中的文件位置如下:

技术分享

4 下面开始编写代码,项目结构如下:

技术分享

5 编写activity_main.xml,代码如下:

<LinearLayout 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:orientation="vertical"

    tools:context=".MainActivity" >

 

    <Button

        android:onClick="click"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="加载图片到内存" />

 

    <ImageView

        android:id="@+id/iv"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent" />

 

</LinearLayout>

6 编写MainActivity,代码如下:

package com.itheima.loadimg;

 

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.BitmapFactory.Options;

import android.os.Bundle;

import android.view.View;

import android.view.WindowManager;

import android.widget.ImageView;

 

public class MainActivity extends Activity {

    private ImageView iv;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       iv = (ImageView) findViewById(R.id.iv);

    }

 

    public void click(View view) {

       // 相当消耗内存资源 根据图片的分辨率而定

       // Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg");

       // iv.setImageBitmap(bitmap);

 

       // 1.得到屏幕的宽高信息

       WindowManager wm = getWindowManager();

       int screenWidth = wm.getDefaultDisplay().getWidth();

       int screenHeight = wm.getDefaultDisplay().getHeight();

       System.out.println("屏幕宽高:" + screenWidth + "-" + screenHeight);

 

       // 2.得到图片的宽高。

       BitmapFactory.Options opts = new Options();// 解析位图的附加条件

       opts.inJustDecodeBounds = true;// 不去解析真实的位图,只是获取这个位图的头文件信息

       Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard2/photo.jpg", opts);

       int bitmapWidth = opts.outWidth;

       int bitmapHeight = opts.outHeight;

       System.out.println("图片宽高: " + bitmapWidth + "-" + bitmapHeight);

 

       // 3.计算缩放比例

       int dx = bitmapWidth / screenWidth;

       int dy = bitmapHeight / screenHeight;

       int scale = 1;

       if (dx > dy && dy > 1) {

           System.out.println("按照水平方法缩放,缩放比例:" + dx);

           scale = dx;

       }

 

       if (dy > dx && dx > 1) {

           System.out.println("按照垂直方法缩放,缩放比例:" + dy);

           scale = dy;

       }

       // 4.缩放加载图片到内存。

       opts.inSampleSize = scale;

       opts.inJustDecodeBounds = false;// 真正的去解析这个位图。

       bitmap = BitmapFactory.decodeFile("/mnt/sdcard2/photo.jpg", opts);

       iv.setImageBitmap(bitmap);

    }

}

7 编写AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.itheima.loadimg"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="19" />

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.itheima.loadimg.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>

=============================================================================

1 图像的拷贝,翻转倒置。

要做如下效果(开始的效果图):

技术分享

点击拷贝一个位图之后的效果:

技术分享

2 编写代码,代码结构如下:

技术分享

3 编写布局文件activity_main.xml

<LinearLayout 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:orientation="vertical"

    tools:context=".MainActivity" >

   

    <Button

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:onClick="click"

        android:text="拷贝一个位图" />

 

    <ImageView

        android:id="@+id/iv1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content" />

 

    <ImageView

        android:id="@+id/iv2"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content" />

   

</LinearLayout>

4 编写MainActivity,内容如下:

package com.itheima.copybitmap;

 

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.os.Bundle;

import android.view.View;

import android.widget.ImageView;

 

public class MainActivity extends Activity {

         private ImageView iv1,iv2;

         private Bitmap alterBitmap;

         private Bitmap srcBmp;

        

         @Override

         protected void onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.activity_main);

        

                   iv1 = (ImageView) findViewById(R.id.iv1);

                   iv2 = (ImageView) findViewById(R.id.iv2);

                   //给第一个imageview默认设置一个位图

                   srcBmp = BitmapFactory.decodeResource(getResources(), R.drawable.tomcat);

                   iv1.setImageBitmap(srcBmp);

                   //创建原图的一个副本。 可修改  创建的是一个空白的图形。

                   alterBitmap = Bitmap.createBitmap(srcBmp.getWidth(), srcBmp.getHeight(),srcBmp.getConfig());

         }

        

         /**

          * 创建原图  bm的一个拷贝。副本

          * @param view

          */

         public void click(View view) {

                   //1.准备一个画板   在上面放上准备好的  空白的位图

                   Canvas canvas = new Canvas(alterBitmap);

                   //2.准备一个画笔

                   Paint paint = new Paint();

                   paint.setColor(Color.BLACK);

                   //3.画画

                   Matrix m = new Matrix();

                   m.setScale(1.0f, -1.0f);

                   m.postTranslate(0, srcBmp.getHeight());

                   canvas.drawBitmap(srcBmp, m, paint);

                   iv2.setImageBitmap(alterBitmap); //把原图的副本设置到界面中

         }

}

 

  1. 拷贝放大图像的方式,只需要将上面的Click方法改成如下的方式:

/**

     * 创建原图bm的拷贝。副本

     * @param view

     */

    public void click(View view) {

       //1.准备一个画板   在上面放上准备好的   空白的位图

       Canvas canvas = new Canvas(alterBitmap);

       //2.准备一个画笔

       Paint paint = new Paint();

       paint.setColor(Color.BLACK);

       //3.画画

       Matrix m = new Matrix();

       m.setScale(2.0f, 2.0f);

       canvas.drawBitmap(srcBmp, m, paint);

       //把原图的副本设置到界面上。

       iv2.setImageBitmap(alterBitmap);

    }

运行效果图如下:

技术分享

如果旋转,只需要将Scale处的代码换成:

m.setRotate(180, srcBmp.getWidth()/2,srcBmp.getHeight()/2);

如果想变换颜色,需要将上面的代码换成:

/**

          * 创建原图 bm的一个拷贝。副本

          * @param view

          */

         public void click(View view){

                   //1.准备一个画板  在上面放上准备好的 空白的位图

                   Canvas canvas = new Canvas(alterBitmap);

                   //2.准备一个画笔

                   Paint paint = new Paint();

                   paint.setColor(Color.BLACK);

                   //3.画画

                   Matrix m = new Matrix();

                  

                   ColorMatrix cm = new ColorMatrix();

                   cm.set(new float[] {

                   0.5f, 0, 0, 0, 0,

                   0, 0.8f, 0, 0, 0,

                   0, 0, 0.6f, 0, 0,

                   0, 0, 0, 1, 0

                   });

                   paint.setColorFilter(new ColorMatrixColorFilter(cm));

                   canvas.drawBitmap(srcBmp, m, paint);

                   iv2.setImageBitmap(alterBitmap);//把原图的副本设置到界面上。

         }

 

业务场景:

1)、手指在一张美女图片上移动时,移动部分的图片会变成成透明,然后显示底部的另外一张图片

2)、当手指离开的时候播放音乐

应用效果图:

技术分享

1 编写应用,代码结构如下:

技术分享

2、编写布局文件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"

    tools:context=".MainActivity" >

 

    <ImageView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_centerHorizontal="true"

        android:layout_centerVertical="true"

        android:src="@drawable/after" />

 

    <ImageView

        android:id="@+id/iv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_centerHorizontal="true"

        android:layout_centerVertical="true"/>

 

</RelativeLayout>

3、编写MainActivity

package com.itheima.play;

 

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.media.MediaPlayer;

import android.os.Bundle;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.ImageView;

 

public class MainActivity extends Activity {

    private ImageView iv;

    // 可以修改的位图

    private Bitmap alertBitmap;

    private Canvas canvas;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       iv = (ImageView) findViewById(R.id.iv);

       Bitmap bitmap = BitmapFactory.decodeResource(getResources(),

              R.drawable.pre);

       // 创建一个空白的原图的拷贝

       alertBitmap = Bitmap.createBitmap(bitmap.getWidth(),

              bitmap.getHeight(), bitmap.getConfig());

       canvas = new Canvas(alertBitmap);

       Paint paint = new Paint();

       paint.setColor(Color.BLACK);

       canvas.drawBitmap(bitmap, new Matrix(), paint);

       iv.setImageBitmap(alertBitmap);

       iv.setOnTouchListener(new OnTouchListener() {

           @Override

           public boolean onTouch(View v, MotionEvent event) {

              switch (event.getAction()) {

              case MotionEvent.ACTION_DOWN:// 手指按下屏幕

                  System.out.println("action down");

                  break;

              case MotionEvent.ACTION_MOVE:// 手指在屏幕上移动

                  int x = (int) event.getX();

                  int y = (int) event.getY();

                  System.out.println("设置("+x+","+y+")透明颜色");

                  for(int i=-4;i<5;i++){

                     for(int j=-4;j<5;j++){

                         try{

                         alertBitmap.setPixel(x+i, y+j, Color.TRANSPARENT);

                         } catch (Exception e) {

                            e.printStackTrace();

                         }

                     }

                  }

                  iv.setImageBitmap(alertBitmap);

                  break;

              case MotionEvent.ACTION_UP:// 手指离开屏幕

                  MediaPlayer.create(getApplicationContext(), R.raw.higirl).start();

                  break;

              }

              return true;//可以重复循环的处理事件

           }

       });

    }

}

4  Android的清单文件如下:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.itheima.play"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="19" />

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.itheima.play.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>

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

19_Android中图片加载到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写

标签:

原文地址:http://blog.csdn.net/tototuzuoquan/article/details/46947729

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!