图形处理【Android】
2016-09-13 10:11
323 查看
一、有关Graphics
手机上显示的任何界面, 无论是文字,按钮或图片, 都是系统内置的一些API绘制的Graphics(图形,图像)
Graphics分为2D和3D两种, 我们这里不去管3D Graphics
在我们应用中操作最多的Graphics就是图片, 如何操作图片是我们要学习的重点
如何利用系统的相关API绘制一个自定义的Graphics也是我们将要去
二、相关API
Bitmap:
位图,图片在内存中数据对象 .bmp .jpg .png
Drawable:
就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable)我们根据画图的需求,创建相应的可画对象
Canvas:
画布,手机屏幕上用于绘图的目标区域
Paint:
我们可以把它看做一个画图工具,比如画笔、画刷。他管理了每个画图工具的字体、颜色、样式。
Matrix:
矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作
三、代码实现:
权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1.图片的读取与保存
package com.example.graphics;
import java.io.FileNotFoundException;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
/*
Bitmap: 加载一张图片数据到内存中, 都可以封装成一个Bitmap对象
需求1: 加载资源文件中的图片资源并显示
需求2: 加载存储空间中的图片资源并显示
需求3: 将一个bitmap对象保存到存储空间中
*/
public class BitmapTestActivity extends Activity {
private ImageView iv_bitmap1;
private ImageView iv_bitmap2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bitmap_test);
iv_bitmap1 = (ImageView) findViewById(R.id.iv_bitmap1);
iv_bitmap2 = (ImageView) findViewById(R.id.iv_bitmap2);
//需求1: 加载资源文件中的图片资源并显示
iv_bitmap1.setImageResource(R.drawable.ic_launcher);
//需求2: 加载存储空间中的图片资源并显示
Bitmap bitmap = BitmapFactory.decodeFile("/storage/sdcard/ic_launcher.png");
iv_bitmap2.setImageBitmap(bitmap);
}
public void saveImage(View v) throws FileNotFoundException{
// 需求3: 将一个bitmap对象保存到存储空间中
Bitmap bitmap = BitmapFactory.decodeFile("/storage/sdcard/ic_launcher.png");
bitmap.compress(CompressFormat.PNG, 100, openFileOutput("ic_launcher.png", Context.MODE_PRIVATE));
Toast.makeText(this, "保存完成", 0).show();
}
}
2.图片的缩放/旋转/平移处理(了解)
package com.example.graphics;
import android.app.Activity;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
public class MatrixTestActivity extends Activity {
private EditText et_matrix_scale;
private EditText et_matrix_rotate;
private EditText et_matrix_translateX;//偏移量X
private EditText et_matrix_translateY;//偏移量Y
private ImageView iv_matrix_icon;
private Matrix matrix;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_matrix_test);
et_matrix_scale = (EditText) findViewById(R.id.et_matrix_scale);
et_matrix_rotate = (EditText) findViewById(R.id.et_matrix_rotate);
et_matrix_translateX = (EditText) findViewById(R.id.et_matrix_translateX);
et_matrix_translateY = (EditText) findViewById(R.id.et_matrix_translateY);
iv_matrix_icon = (ImageView) findViewById(R.id.iv_matrix_icon);
matrix = new Matrix();
}
public void scaleBitmap(View v){
float scale = Float.parseFloat(et_matrix_scale.getText().toString());
//保存缩放比例
matrix.postScale(scale, scale);
//将matrix设置到imageView
iv_matrix_icon.setImageMatrix(matrix);
}
public void rotateBitmap(View v){
float degree = Float.parseFloat(et_matrix_rotate.getText().toString());
//保存旋转角度
matrix.postRotate(degree);
//将matrix设置到imageView
iv_matrix_icon.setImageMatrix(matrix);
}
public void translateBitmap(View v){
float dx = Float.parseFloat(et_matrix_translateX.getText().toString());
float dy = Float.parseFloat(et_matrix_translateY.getText().toString());
//保存平移数据
matrix.postTranslate(dx, dy);
//将matrix设置到imageView
iv_matrix_icon.setImageMatrix(matrix);
}
public void clearMatrix(View v){
matrix.reset();
//将matrix设置到imageView
iv_matrix_icon.setImageMatrix(matrix);
}
}
3.Shape图形图片
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 圆角 -->
<corners android:radius="8dp" >
</corners>
<!-- 描边 -->
<stroke
android:dashGap="2dp"
android:dashWidth="10dp"
android:width="4dp"
android:color="#00ff00" />
<!-- 尺寸 -->
<size
android:height="40dp"
android:width="100dp" />
<!-- 内部单色填充 -->
<solid android:color="#ff0000" />
<!-- 内部渐变色填充 -->
<gradient
android:centerColor="#ffffff"
android:endColor="#ffff00"
android:startColor="#0000ff"
android:angle="90">
</gradient>
</shape>Selector多状态图片
selector多状态图形在可以在正常,按下,选中等状态下显示不同的图形, 在应用中十分常用
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true">
<shape>
<corners android:radius="5dp"/>
<solid android:color="#ff0000"/>
<padding android:top="5dp" android:bottom="5dp"/>
</shape>
</item>
<item>
<shape>
<corners android:radius="10dp"/>
<solid android:color="#00ff00"/>
<padding android:top="5dp" android:bottom="5dp"/>
</shape>
</item>
</selector>
4.9patch图片(.9.png)
.9.png图片是一种特别的png图片, 它在放大显示时不会失真
.9.png图片可以分为三种类型区域
正中间区域: 可向水平和垂直方向复制扩展
中上, 中下, 中左与中右区域: 只能向一个方向扩展
四个角区域: 大小不会变化
手机上显示的任何界面, 无论是文字,按钮或图片, 都是系统内置的一些API绘制的Graphics(图形,图像)
Graphics分为2D和3D两种, 我们这里不去管3D Graphics
在我们应用中操作最多的Graphics就是图片, 如何操作图片是我们要学习的重点
如何利用系统的相关API绘制一个自定义的Graphics也是我们将要去
二、相关API
Bitmap:
位图,图片在内存中数据对象 .bmp .jpg .png
Drawable:
就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable)我们根据画图的需求,创建相应的可画对象
Canvas:
画布,手机屏幕上用于绘图的目标区域
Paint:
我们可以把它看做一个画图工具,比如画笔、画刷。他管理了每个画图工具的字体、颜色、样式。
Matrix:
矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作
三、代码实现:
权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1.图片的读取与保存
package com.example.graphics;
import java.io.FileNotFoundException;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
/*
Bitmap: 加载一张图片数据到内存中, 都可以封装成一个Bitmap对象
需求1: 加载资源文件中的图片资源并显示
需求2: 加载存储空间中的图片资源并显示
需求3: 将一个bitmap对象保存到存储空间中
*/
public class BitmapTestActivity extends Activity {
private ImageView iv_bitmap1;
private ImageView iv_bitmap2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bitmap_test);
iv_bitmap1 = (ImageView) findViewById(R.id.iv_bitmap1);
iv_bitmap2 = (ImageView) findViewById(R.id.iv_bitmap2);
//需求1: 加载资源文件中的图片资源并显示
iv_bitmap1.setImageResource(R.drawable.ic_launcher);
//需求2: 加载存储空间中的图片资源并显示
Bitmap bitmap = BitmapFactory.decodeFile("/storage/sdcard/ic_launcher.png");
iv_bitmap2.setImageBitmap(bitmap);
}
public void saveImage(View v) throws FileNotFoundException{
// 需求3: 将一个bitmap对象保存到存储空间中
Bitmap bitmap = BitmapFactory.decodeFile("/storage/sdcard/ic_launcher.png");
bitmap.compress(CompressFormat.PNG, 100, openFileOutput("ic_launcher.png", Context.MODE_PRIVATE));
Toast.makeText(this, "保存完成", 0).show();
}
}
2.图片的缩放/旋转/平移处理(了解)
package com.example.graphics;
import android.app.Activity;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
public class MatrixTestActivity extends Activity {
private EditText et_matrix_scale;
private EditText et_matrix_rotate;
private EditText et_matrix_translateX;//偏移量X
private EditText et_matrix_translateY;//偏移量Y
private ImageView iv_matrix_icon;
private Matrix matrix;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_matrix_test);
et_matrix_scale = (EditText) findViewById(R.id.et_matrix_scale);
et_matrix_rotate = (EditText) findViewById(R.id.et_matrix_rotate);
et_matrix_translateX = (EditText) findViewById(R.id.et_matrix_translateX);
et_matrix_translateY = (EditText) findViewById(R.id.et_matrix_translateY);
iv_matrix_icon = (ImageView) findViewById(R.id.iv_matrix_icon);
matrix = new Matrix();
}
public void scaleBitmap(View v){
float scale = Float.parseFloat(et_matrix_scale.getText().toString());
//保存缩放比例
matrix.postScale(scale, scale);
//将matrix设置到imageView
iv_matrix_icon.setImageMatrix(matrix);
}
public void rotateBitmap(View v){
float degree = Float.parseFloat(et_matrix_rotate.getText().toString());
//保存旋转角度
matrix.postRotate(degree);
//将matrix设置到imageView
iv_matrix_icon.setImageMatrix(matrix);
}
public void translateBitmap(View v){
float dx = Float.parseFloat(et_matrix_translateX.getText().toString());
float dy = Float.parseFloat(et_matrix_translateY.getText().toString());
//保存平移数据
matrix.postTranslate(dx, dy);
//将matrix设置到imageView
iv_matrix_icon.setImageMatrix(matrix);
}
public void clearMatrix(View v){
matrix.reset();
//将matrix设置到imageView
iv_matrix_icon.setImageMatrix(matrix);
}
}
3.Shape图形图片
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 圆角 -->
<corners android:radius="8dp" >
</corners>
<!-- 描边 -->
<stroke
android:dashGap="2dp"
android:dashWidth="10dp"
android:width="4dp"
android:color="#00ff00" />
<!-- 尺寸 -->
<size
android:height="40dp"
android:width="100dp" />
<!-- 内部单色填充 -->
<solid android:color="#ff0000" />
<!-- 内部渐变色填充 -->
<gradient
android:centerColor="#ffffff"
android:endColor="#ffff00"
android:startColor="#0000ff"
android:angle="90">
</gradient>
</shape>Selector多状态图片
selector多状态图形在可以在正常,按下,选中等状态下显示不同的图形, 在应用中十分常用
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true">
<shape>
<corners android:radius="5dp"/>
<solid android:color="#ff0000"/>
<padding android:top="5dp" android:bottom="5dp"/>
</shape>
</item>
<item>
<shape>
<corners android:radius="10dp"/>
<solid android:color="#00ff00"/>
<padding android:top="5dp" android:bottom="5dp"/>
</shape>
</item>
</selector>
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 按下的图片 (必须写在前面)--> <item android:state_pressed="true" android:drawable="@drawable/main_index_search_pressed"></item> <!-- 正常情况下的图片 --> <item android:drawable="@drawable/main_index_search_normal"></item> </selector>
4.9patch图片(.9.png)
.9.png图片是一种特别的png图片, 它在放大显示时不会失真
.9.png图片可以分为三种类型区域
正中间区域: 可向水平和垂直方向复制扩展
中上, 中下, 中左与中右区域: 只能向一个方向扩展
四个角区域: 大小不会变化
相关文章推荐
- Android串口操作,简化android-serialport-api的demo(附源码)
- android开发中创建按钮事件监听器的几种方法
- Android 安全加密:消息摘要Message Digest详解
- Android系统应用开发(七)屏蔽Home键和屏幕的唤醒和休眠,AlarmManager
- [Android测试] Android Studio+Appium+Java+Windows 自动化测试之二:Appium环境安装搭建
- Android 泛型小例 findById
- Android 安全加密:非对称加密详解
- Android系统应用开发(六)Android framework系统默认设置修改
- 应用程序未安装:已安装了存在签名冲突的同名数据包。
- 关于Android开发软件图标尺寸
- make版本不符合要求,不能编译android的解决方法
- Android Framework系统服务详解
- Android Binder机制----实现自定义的系统服务
- Android使用 SO 库时要注意的一些问题
- Android图片文件缓存
- Android系统应用开发(五)android 输入法类说明
- onWindowFocusChanged重要作用
- com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0 报错的解决记录
- Android Rxjava的三种方法的简化版
- android中drawable资源的解释及例子