本篇是关于Drawable的第五篇博客了,PictureDrawable我感觉你如果不是做互联网开发或者对数据流量比较敏感的话,一般应该是用不到的(我是胡说的,反正我不做互联网开发,我自己如果不是因为写这篇博客,我也不会使用这个类的)。
废话不多说了,直接进入正题吧!
先看一下大概效果(其实哪有什么效果可言呀!)
主布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.picturedrawable.MainActivity">
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="400dp"
android:minWidth="400dp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/iv"
android:layout_marginTop="20dp"
android:onClick="setImageViewBg"
android:text="@string/set_image" />
</RelativeLayout>
主 Java文件:
package com.example.picturedrawable;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Picture;
import android.graphics.drawable.PictureDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private ImageView iv;
private PictureDrawable pictureDrawable;
private int width;
private int height;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView)findViewById(R.id.iv);
}
private void initPictureDrawable(){
Picture picture = new Picture();
width = iv.getMinimumWidth();
height = iv.getMinimumHeight();
Canvas c = picture.beginRecording(width,height);
Paint p = new Paint();
p.setColor(Color.GREEN);
c.drawCircle(width/2,height/2,200,p);
picture.endRecording();
pictureDrawable = new PictureDrawable(picture);
}
@Override
protected void onResume() {
super.onResume();
initPictureDrawable();
}
public void setImageViewBg(View view){
Bitmap bitmap = Bitmap.createBitmap(width,height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.first),0,0,null);
pictureDrawable.setBounds(0,0,width,height);
pictureDrawable.draw(canvas);//直接调用不会绘制任何东西到canvas上的,必须先设置好bounds
// canvas.drawPicture(pictureDrawable.getPicture());
iv.setImageBitmap(bitmap);
}
}
代码一共就这么多,使用PictureDrawable的时候,其实更多的实在使用其中的Picture,它有几个重要的方法。比如 createFromStream、writeToStream、beginRecording和endRecording。Picture只是记录绘制步骤的信息,并没有像素数据,直接设置PictureDrawable为背景是不会显示的,需要调用draw方法。
绘制PictureDrawable其实就是在绘制里面的Picture,如果直接调用PictureDrawable.draw的话,也是无法绘制出图形的,因为没有指定绘制区域,需要先指定bounds。如果是调用 Canvas.drawPicture(PictureDrawable.getPicture())则不需要。这个看一下源码就清除了!
createFromStream、writeToStream分别是向流中读取、写入一个Picture,如果是远程传输的话,就不需要传大量的像素信息,只需要传绘制过程记录即可,可在另一端从新绘制,感觉应该会更节省流量吧!!(自己猜的)
这是我的公众号,如果可以的话,还请您关注一下,这将是对我最大的鼓励,谢谢!!