图形处理【Android】

一、有关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图片可以分为三种类型区域

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

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

四个角区域: 大小不会变化



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值