您的位置:首页 > 移动开发 > Android开发

图形处理【Android】

2016-09-13 10:11 274 查看
一、有关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>
<?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图片可以分为三种类型区域

正中间区域: 可向水平和垂直方向复制扩展

中上, 中下, 中左与中右区域: 只能向一个方向扩展

四个角区域: 大小不会变化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: