标签:
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(). int screenHeight = wm.getDefaultDisplay(). 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); //把原图的副本设置到界面中 } } |
拷贝放大图像的方式,只需要将上面的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