习惯了使用java里的graphics类来绘制图形及图片,编写android的对图形及图片的绘制使用起来一直不太顺手。
下面我来小结一下目前使用过的android中画图片的方法
一、使用控件的setImageResource方法
1.在main.xml文件中写一个ImageView(TestView也能行,感觉只要是继承自View类的话都可以实现,但是没有逐个 去检验) 或者ImageButton等控件如下:
<LineLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/board" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView> <ImageButton android:id="@+id/piece" android:layout_width="20px" android:layout_height="20px"></ImageButton> </LineLayout>
2.将图片文件 piece.jpg和board.jpg放在res.drawable 文件夹下(drawable-hdpi,drawable-mdpi, drawable-ldpi,分别表示高像素,中像素,低像素的图片),暂且放在drawable-hdpi下吧。
3.接着将src下的main.java修改如下
public class main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 通过findViewById获得ImageView
board = (ImageView) findViewById(R.id.board);
// 为ImageView设置图片资源
board.setImageResource(R.drawable.board);
// 通过findViewById获得ImageButton
piece = (ImageButton) findViewById(R.id.piece);
// 为ImageButton设置图片资源
piece.setImageResource(R.drawable.piece);
}
// 图片视图ImageView
private ImageView board;
private ImageButton piece;
}
4.运行android application 结果如附件中imagtest1.jpg所示。
二、使用View类的onDraw(Canvas canvas)方法和invalidate()实现在棋盘上画棋子
个人感觉如同如java中Panel的paint方法在Panel第一次显示的时候调用绘制Panel,repaint则是提供给程序员手动调用paint方法。
android中View类的onDraw方法,也是在View第一次显示的时候调用绘制View,invalidate()也是提供给程序员手动调用onDraw方法。
具体实现方法如下:(本例承接上个一例子,修改了部分代码)
1.新建一个ImageViewSelf.java 继承自ImageView
public class ImageViewSelf extends ImageView {
//实例化一个paint对象,其可以设置canvas绘制图形的颜色等属性
Paint paint = new Paint();
//获得piece.jpg图片的资源,创建Bitmap对象
private Bitmap bitmap;
//以下三个构造方法本人暂时不懂啥意思
public ImageViewSelf(Context context) {
super(context);
}
public ImageViewSelf(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ImageViewSelf(Context context, AttributeSet attrs) {
super(context, attrs);
}
//设置bitmap的图片资源
public void initImage(){
bitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.piece));
}
//重写onDraw方法
public void onDraw(Canvas canvas)
{
//执行父类的onDraw方法
super.onDraw(canvas);
if(bitmap!=null){
//在150,150坐标处画图bitmap图形
canvas.drawBitmap(bitmap, 150, 150, paint);
}
}
}
2.修改main中的ImageView为ImageViewself.test.ImageViewSelf
<Imagetest.test.ImageViewSelf android:id="@+id/board" android:layout_width="fill_parent" android:layout_height="wrap_content"></Imagetest.test.ImageViewSelf>
3.修改main.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 通过findViewById获得ImageView
board = (ImageViewSelf) findViewById(R.id.board);
// 为ImageView设置图片资源
board.setImageResource(R.drawable.board);
// 通过findViewById获得ImageButton
piece = (ImageButton) findViewById(R.id.piece);
// 为ImageButton设置图片资源
piece.setImageResource(R.drawable.piece);
//添加监听器
piece.setOnClickListener(cl);
}
// 实例化一个按键监听器
private Button.OnClickListener cl = new Button.OnClickListener() {
public void onClick(View v) {
//调用intitImage方法,设置图片资源
board.initImage();
//刷新board,手动调用onDraw
board.invalidate();
}
};
// 图片视图ImageView
private ImageViewSelf board;
private ImageButton piece;
}
4.修改完毕后,运行程序,开始棋盘上是没有棋子的,点击按钮后,执行initImage()和invalidata()方法后,期盼上会出现一个棋子。
程序运行结果如附件中imagetest2.jpg
paint类可以设置画笔的颜色等参数,canvas中提供了各种画图形的方法,如画图片、圆形、矩形等
以上两个类结合起来使用也就相当于java的Graphics。
android画图的例子也就完成了!
第一个例子的全部代码及文件在imagetest压缩文件中
第二个例子的全部代码及文件在imagetest2压缩文件中
未解决问题:
1.使用语句bitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.piece));得到的图像大小比真实稍小。 ??
2.ImageViewSelf中构造方法中各参数的含义。 ??
续:关于之前所提到的第一个问题:可以使用Rect 来控制绘画图片的大小。
使用 canvas. drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)
其第一个Rect src 是所需要绘制的bitmap图片的区域,需要注意rect的构造方法中四个参数为左坐标,上坐标,右坐标及下坐标。
并不是java所习惯的左坐标,上坐标,宽度及高度。
第二个Rect dst 表示的是在view中的哪个区域绘制图片。
例:
Rect src = new Rect(0, 0,35,35);
Rect dst = new Rect(50,50, 90,90);
canvas.drawBitmap(cursor,src,dst,paint);
以上代码表示在view中的dst区域内,绘制bitmap对象cursor的0,0,35,35的图像。
两个Rect大小不一致是没有关系的,绘制时会自动填充。