android.graphics.BitmapRegionDecoder

本文介绍BitmapRegionDecoder类的使用方法及API细节,包括如何解码大图片的特定区域以节省内存资源,提供了newInstance方法的不同调用方式以及decodeRegion方法的使用说明。

 BitmapRegionDecoder能用来解码一张图片的某个矩形区域,这个类一般用在图片过大而你又只需要该图片的一部分的时候。为了生成BitmapRegionDecoder对象,可以调用newInstance(...),得到BitmapRegionDecoder后,使用者可以反复调用decodeRegion来获得该图片的不同区域的解码得到的bitmap.

 

public Bitmap decodeRegion (Rect rect, BitmapFactory.Options options)

解码该图片的一个矩形区域,该区域由rect决定,返回值为显示图像为该区域的bitmap,注意options中不能使用inPurgeable这个参数

public int getHeight ()
public int getWidth ()

获取原图片的宽和高

public final boolean isRecycled ()

判断该对象是否被回收利用,如果是,那么调用它的方法会报错

public static BitmapRegionDecoder newInstance (String pathName, boolean isShareable)

用于创建BitmapRegionDecoder,pathName表示路径,只有jpeg和png图片才支持这种方式,isShareable如果为true,那BitmapRegionDecoder会对输入流保持一个表面的引用,如果为false,那么它将会创建一个输入流的复制,并且一直使用它。即使为true,程序也有可能会创建一个输入流的深度复制。如果图片是逐步解码的,那么为true会降低图片的解码速度。如果路径下的图片不是支持的格式,那就会抛出异常

public static BitmapRegionDecoder newInstance (InputStream is, boolean isShareable)

同上,不过参数is变成了输入流

public static BitmapRegionDecoder newInstance (FileDescriptor fd, boolean isShareable)

同上,不过参数变成了文件描述符,在函数运行完之前,文件描述符不可以改变

public static BitmapRegionDecoder newInstance (byte[] data, int offset, int length, boolean isShareable)

同上,不过参数变成了字节数组,offset为起始位置,length为长度

public void recycle ()

释放与BitmapRegionDecoder相关的内存,标记它已经死亡,调用它的任何非静态函数都会抛出异常,这个操作是不可逆的,所以当你决定调用时,请确认这个对象是不打算继续用了的,这个方法也是个超前的方法,其实根本用不着调用,当外面没有任何该对象的引用时,垃圾回收期自动会将它回收,后续看到的recycle就不说了,都是同一个意思

protected void finalize ()

当垃圾回收器发现该实例不能再被获得的时候就会调用该函数,默认的代码里边该函数什么也不做,不过可以重写该函数来释放资源。

注意重写了该函数的对象比没重写该函数的对象更值得关注,在实例不可被获得后的很长一段时间,结束者都会继续运行,这依赖于内存的压力,所以依赖它们去清除资源是个不好的方法。结束者运行在一个单独的VM-wide线程中,所以在它里边运行会导致阻塞的工作是个不好的主意。一个结束者通常是有必要的,当一个类有它自身的资源并且需要调用它自身的函数来销毁时。尽管这样,这比明确的提供一个close方法并且坚持手工的去释放该实例要好的多。手工释放适合文件这些实例,但不适合哪些拥有很多临时引用的大型实例。不幸的是,代码在单独的结束者线程中会产生大量的临时引用。

如果你一定要用结束者,考虑要至少有你自己的引用队列和线程队列。不像创造函数那样,结束者需要你自己调用super.finalize(),不抛出异常的话结束者会被忽略并且不会结束结束者的线程。

 

 

<think>好的,用户让我解析并注释一段Android自定义View的导入语句和类定义。首先,我需要确认用户的需求。他们可能刚开始学习Android开发,对自定义View的组成不太清楚,特别是导入的各个包和类的作用。 用户之前问了关于构造函数的问题,现在扩展到整个类的导入部分,可能想全面了解每个导入的作用,以及它们如何协同工作来创建自定义View。需要逐一分析每个import语句,解释对应的Android类或接口的用途,并说明它们在这个自定义View中的作用。 接下来,我需要检查每个导入的包。例如,android.content.Context用于访问应用资源,android.graphics下的类用于绘图,而android.view.View是自定义View的基类。用户可能不太清楚为什么需要这些导入,以及如何在实际代码中使用它们。 还要注意用户可能没有提到的深层需求,比如他们可能想了解如何开始编写自定义View,或者遇到绘图相关的问题需要排查。因此,在注释时要强调关键类的作用,比如Canvas和Paint在绘图中的重要性,Path用于绘制路径,AttributeSet用于XML属性处理。 另外,用户之前的回答中提到了构造函数的不同形式,这里可能需要提到AttributeSet的作用,即使当前代码中没有使用到,但通常会出现在自定义View的构造函数中,以支持XML布局中的属性。需要确保解释清晰,结构分明,帮助用户逐步理解每个部分的功能。 最后,总结整个导入部分的作用,强调这些是Android绘图和视图系统的核心组件,让用户明白这些导入是创建自定义绘图视图的基础。可能还需要提醒用户注意常见的错误,比如忘记导入某个类导致编译错误,或者错误使用绘图方法导致的显示问题。</think>以下是对代码片段的逐行解析和注释说明: ```java // Android上下文相关包,提供应用环境信息 import android.content.Context; // 基础上下文对象,用于访问资源、启动组件等 // Android图形绘制核心包 import android.graphics.Canvas; // 画布对象,用于执行实际绘制操作 import android.graphics.Color; // 颜色常量(如Color.RED)和颜色转换工具 import android.graphics.Paint; // 画笔工具,控制绘制样式(颜色/粗细/抗锯齿等) import android.graphics.Path; // 路径工具,用于绘制复杂矢量图形 // XML属性处理 import android.util.AttributeSet; // XML布局属性集合,用于解析自定义属性 // 视图基础类 import android.view.View; // 所有视图的基类,提供基础视图功能 ``` ### 扩展说明(按功能分组): 1. **上下文基础** ```java import android.content.Context; ``` - 作用:提供应用全局信息接口 - 典型应用: - 访问资源(`getResources()`) - 启动Activity/Service - 获取系统服务(如`getSystemService()`) 2. **绘图核心组件** ```java import android.graphics.Canvas; // 相当于真实画布的数字抽象 import android.graphics.Paint; // 相当于真实绘画的画笔 import android.graphics.Path; // 相当于作画时的运动轨迹记录 ``` - 使用模式: ```java @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.RED); Path path = new Path(); path.moveTo(0, 0); path.lineTo(100, 100); canvas.drawPath(path, paint); // 三者的协同工作 } ``` 3. **属性系统** ```java import android.util.AttributeSet; ``` - 作用:处理XML布局中定义的属性 - 典型使用场景: ```java public class MyView extends View { public MyView(Context context, AttributeSet attrs) { super(context, attrs); // 解析自定义属性 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView); // ... } } ``` 4. **视图基础** ```java import android.view.View; ``` - 继承关系:`Object → View` - 关键功能: - 生命周期回调(onDraw/onMeasure等) - 事件处理(onTouchEvent) - 布局控制(onLayout) ### 典型自定义View类结构示例: ```java public class DrawingView extends View { private Paint mPaint; private Path mPath; // 构造函数组 public DrawingView(Context context) { super(context); init(); } public DrawingView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Color.BLUE); mPaint.setStrokeWidth(5f); mPath = new Path(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(mPath, mPaint); // 实际绘制逻辑 } } ``` 这些导入语句共同构成了Android自定义绘图视图的基础框架,后续开发中通常还会添加手势处理、动画效果等扩展功能。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值