【Android】图片资源的加载、简单处理
Android常用的绘图类有Bitmap
类、BitmapFactory
类、Canvas
类、Paint
类,下面分别做简单的总结
Bitmap
类即位图类,主要方法有以下几个
createBitmap(int width, int height, Bitmap.Config config)----创建指定宽度、高度的位图
compress(Bitmap.CompressFormat format, int quality, OutputStream stream)----保存位图,用于把位图写出到一个OutputStream
BitmapFactory
类即位图工厂,主要用于从不同的数据源来解析、创建Bitmap
对象。主要方法有
decodeFile(String pathName)----从指定文件中解析、创建`Bitmap`对象。传入图片路径的字符串
decodeResource(Resources res, int id)----根据给定的资源id,从指定资源解析、创建`Bitmap`对象
decodeStream(InputStream is)----从指定的输入流中解析、创建`Bitmap`对象
Paint
类即花壁类。用来描述图形的颜色、线宽、透明度、填充效果等信息。使用时首先要创建Paint
对象。通过对象来调用相应方法设置上述信息。主要有以下方法
Paint()----Create a new paint with default settings.构造器,用来创建一个paint对象 ,使用默认属性
Paint(int flags)----Create a new paint with the specified flags.构造器,用来创建一个paint对象 ,使用指定flags属性
setColor(int color)----Set the paint's color.设置颜色
setAlpha(int a)---- that only assigns the color's alpha value, leaving its r,g,b values unchanged.设置透明度
setDither(boolean dither)----辅助设定是否使用图片抖动处理
setAntiAlias(boolean aa)----设置是否使用抗锯齿功能
setShadowLayer(float radius, float dx, float dy, int shadowColor)----设置阴影参数,radius表示阴影角度,dx、dy、shadowColor分别表示阴影的位置坐标以及颜色参数
setTextAlign(Paint.Align align)----设置绘制文本时的文字对齐方式
setTextSize(float textSize)----设置绘制文本时的文字大小
setFakeBoldText(boolean fakeBoldText)----设置绘制文字时是否为粗体文字
setXfermode(Xfermode xfermode)----设置图形重叠时的处理方式,比如合并、取交集或并集,经常用来制作橡皮的擦除效果
Canvas
类代表画布,通过该类提供的方法可以绘制出各种图形,比如圆形、矩形、线条等。在Android中绘图首先要创建一个继承自View
的视图,然后重写其onDraw()
方法,然后再Activity
中添加该视图。下面来看Canvas
类中的主要方法如下
Canvas()----构造器,创建一个空的Canvas对象
Canvas(Bitmap bitmap)----Construct a canvas with the specified bitmap to draw into.构造器,创建一个Canvas对象,接收一个位图对象作为参数,在该位图对象上绘图
drawRect(RectF rect, Paint paint)----使用画笔画出指定矩形
drawRect(RectF rect, Paint paint)----使用画笔画出指定椭圆形
drawCircle(float cx, float cy, float radius, Paint paint)----使用画笔在指定位置cx、cy画指定半径radius的圆形
drawLine(float startX, float startY, float stopX, float stopY, Paint paint)----使用画笔画出指定起点startX、startY和指定终点stopX、stopY的直线
值得特别说明的是创建Canvas
对象的时候需要传入三个参数,其中第二个参数需要接收一个Matrix对象即矩阵对象,Android中对图片的处理都是通过矩阵来实现的,其实很多专业的图片、图像处理软件例如ps
、pr
等也都是通过矩阵来实现对像素的处理。那么我们就可以通过创建一个矩阵对象来调用其相应方法来实现对图片的平移、缩放、旋转这三种基本的特效处理,然后在中和三种处理的基础上实现镜面效果、湖面倒影效果等。具体通过下面代码来看
首先来看布局文件,定义可一个按钮加载效果图片,和两个ImageView
用来显示处理前后的图片,形成对比。
<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" ><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/load_picture" android:onClick="loadPicture"/><ImageView android:id="@+id/iv_src"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ImageView android:id="@+id/iv_copy"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>
再来看MainActivity
代码如下,其实Android中处理图片的步骤也就分五步,在下面的代码中我都通过序号来标出方便查看
package com.example.picturehandle;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void loadPicture(View v) {// 通过指定资源ID加载图片。加载原图Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.new_manhua);// 1.创建原图的副本.与原图宽高一样Bitmap bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());// 2.创建画笔Paint paint = new Paint();// 3.创建画布Canvas canvas = new Canvas(bmCopy);// 4.开始作画。特效处理// 4.1创建一个矩阵对象Matrix mt = new Matrix();
// // 4.1.1旋转效果
// mt.setRotate(45, bmCopy.getWidth() / 2, bmCopy.getHeight() / 2);
// // 4.1.2平移效果
// mt.setTranslate(30, 60);
// // 4.1.3缩放效果
// mt.setScale(0.8f, 1.5f);
// // 4.1.4镜像效果。通过缩放、平移
// mt.setScale(-1, 1); // 缩放水平值设为-1,竖直值设为1
// mt.postTranslate(bmCopy.getWidth(), 0); // 向右平移图片宽度个像素// 4.1.5倒影效果。通过缩放、平移mt.setScale(1, -1);mt.postTranslate(0, bmCopy.getHeight());// 4.2把设置好的矩阵传入画布canvas.drawBitmap(bmSrc, mt, paint);// 5.1显示原图ImageView iv_src = (ImageView) findViewById(R.id.iv_src);iv_src.setImageBitmap(bmSrc);// 5.2显示副本ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);iv_copy.setImageBitmap(bmCopy);}
}
最后贴一个TearClothes
的简单应用。先说一下实现的原理,上下两张图片重叠在一起显示,所以在未处理之前我们只看得到上层的图片,我们通过设置触摸监听事件,当手指滑动时将滑动的轨迹设置为透明,这样就可以实现擦除效果。其实早在10年Android刚刚普及的时候,市场就有很多应用用的是这个原理实现的,比如撕衣服、刮刮乐等应用。下面看代码
<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="${relativePackage}.${activityClass}"android:orientation="vertical" ><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/after"/><ImageViewandroid:id="@+id/cover"android:layout_width="wrap_content"android:layout_height="wrap_content"/></RelativeLayout>
MainActivity
代码如下
package com.example.tearclothes;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.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;public class MainActivity extends Activity {private ImageView pre;private Bitmap prec;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// // 加载底层图片
// Bitmap biUnder = BitmapFactory.decodeResource(getResources(), R.drawable.after);
// // 拿到ImageView实例
// ImageView after = (ImageView) findViewById(R.drawable.after);
// after.setImageBitmap(biUnder);// 加载上层图片Bitmap biUp = BitmapFactory.decodeResource(getResources(), R.drawable.pre);// 拿到ImageView实例pre = (ImageView) findViewById(R.id.cover);// 显示上层图片pre.setImageBitmap(biUp);// 拿到上层图片副本prec = Bitmap.createBitmap(biUp.getWidth(), biUp.getHeight(), biUp.getConfig());// 画笔Paint paint = new Paint();// 画布Canvas canvas = new Canvas(prec);// 作画canvas.drawBitmap(biUp, new Matrix(), paint);pre.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_MOVE:int x = (int) event.getX();int y = (int) event.getY();for (int i = -5; i < 5; i++) {for (int j = -5; j < 5; j++) {// 把透明区域设置为圆形if (Math.sqrt(i*i + j*j) <= 10)// 把捕捉到的坐标对应的像素设置为透明prec.setPixel(x + i, y + j, Color.TRANSPARENT);}}pre.setImageBitmap(prec);break;default:break;}return true;}});}
}
【Android】图片资源的加载、简单处理相关推荐
- Android Glide图片加载框架(三)缓存机制
文章目录 一.缓存简介 二.缓存用法 内存缓存方式 磁盘缓存方式 三.缓存KEY 四.内存缓存 内存缓存流程 五.磁盘缓存 磁盘缓存流程 Android Glide图片加载框架系列文章 Android ...
- Android Glide图片加载框架(二)源码解析之load()
文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...
- Android Glide图片加载框架(一)基本用法
文章目录 一.前言 二.简介 三.基本用法 第一步:调用 Glide.with() 方法创建加载图片的实例 第二步:调用 load() 方法指定待加载的图片资源 第三步:调用 into() 方法绑定显 ...
- Android 三大图片加载框架的对比——ImageLoader,Picasso,Glide
一.ImageLaoder介绍 << Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹ass ...
- Android 高清加载巨图方案 拒绝压缩图片
Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自: ...
- Android类动态加载技术
Android类动态加载技术 Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式 ...
- Android studio 使用心得(六)---android studio 如何加载.so文件
2019独角兽企业重金招聘Python工程师标准>>> 之前一直没怎么注意,以为.so文件android为像eclipse一样直接加载,但是直到昨天我在android studio上 ...
- android 加载进度,Android实现图片加载进度提示
本文实例为大家分享了Android实现图片加载进度提示的具体代码,供大家参考,具体内容如下 先上图: 实现原理: 第一个控件的实现原理是重写ImageView的onDraw()方法,利用Canvas的 ...
- Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...
- Android Loader 异步加载详解一:基础概念
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70241844 本文出自[赵彦军的博客] Android Loader 异步加载详解 ...
最新文章
- log4j2配置实例[按小时记录日志文件]
- UVa10970 - Big Chocolate(计数问题)
- gitlab mysql 表_gitlab-mysql_高可用
- halcon的算子清点:Chapter 8线的属性
- 北京理工大学计算机学院 王亮,王 亮
- 基于51单片机的指纹考勤系统
- 修改保存hosts文件
- 项目管理中的冰山理论
- Inferred type S for type parameter S is not within its bound
- 数值分析基础工具使用Matlab绘制双曲线
- 如何带团队,怎么带团队。
- o7_dictionary_accessibility 参数
- Pytest和unittest的对比
- c++操作Office之Word
- JSON格式数据示例操作
- Linux企业化运维--(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步
- C---头指针尾指针
- 吃豆腐”与“吃醋”的幽默来历
- c语言 extend 函数,jQuery中$.extend()数组合并用法
- linux免安装版,Linux下配置免安装版Tomcat