Android P图像媒体后期处理

Android P引入了新的ImageDecoder,该类除了支持对各种图片格式的解码、缩放、裁剪之外,其强大之处在于支持对解码后的图像做后期处理(post-process),使用该功能可以添加复杂的自定义特效,比如圆角,或是将图片放在圆形像框中。编写后期处理回调函数,你可以添加任何绘图指令实现需要的效果。


此外,Android P原生支持GIF和WebP格式的动图,新增了AnimagedImageDrawable类,并被新增的解码器类ImageDecoder直接支持,用法跟矢量动画类AnimatedVectorDrawable类似,实现方式也类似,通过新增渲染线程和工作线程,不需要在UI线程处理动图更新,可以说是无痛使用,非常省心。


下面通过编写代码,显示一张gif图,并利用后期处理机制,在图像中间绘制一个绿色的实心圆。



final ImageView image = (ImageView) findViewById(R.id.image);
File gifFile = new File("/data/local/tmp/test.gif");
if (!gifFile.exists()) {
   Log.d(TAG, "gifFile is not exsited!");
   return;
}
 
ImageDecoder.Source source = ImageDecoder.createSource(gifFile);
try {
    d = ImageDecoder.decodeDrawable(source, new ImageDecoder.OnHeaderDecodedListener() {
        @Override
        public void onHeaderDecoded(ImageDecoder imageDecoder, final ImageDecoder.ImageInfo imageInfo, ImageDecoder.Source source) {
            imageDecoder.setPostProcessor(new PostProcessor() {
                @Override
                public int onPostProcess(Canvas canvas) {
                    int w = imageInfo.getSize().getWidth();
                    int h = imageInfo.getSize().getHeight();
                    Paint paint = new Paint();
                    paint.setAntiAlias(true);
                    paint.setColor(Color.GREEN);
                    canvas.drawCircle(w/2, h/2, h/4, new Paint(paint));
                    return 0;
                }
            });
        }
    });
    image.setVisibility(View.VISIBLE);
    image.setImageDrawable(d);
} catch (IOException e){
    Log.d(TAG, e.toString());
}
Button button = (Button) findViewById(R.id.buttonText);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (d != null && d instanceof AnimatedImageDrawable) {
            AnimatedImageDrawable ad = (AnimatedImageDrawable) d;
            if (ad.isRunning()) {
                Log.d(TAG, "stop running");
                ad.stop();
            } else {
                Log.d(TAG, "start running");
                ad.start();
            }
        }
    }
});

你可能感兴趣的:(Android,P,ImageDecoder)