Android绘图用到的几个类
private ImageView ivDraw; //图像视图显示图片
private Bitmap bitMap; //位图,类似于画框,可以对图片做行列处理
private Canvas canvas; //画布
private Paint p; //画笔
Handler dh; //处理器
1、ImageView:类似于javaSE中的JFrame组件,这是一个可以用来画图的组件,也是后面几个类的基础,在Android中,ImageView的作用是实现图像的显示,在处理器中更新显示,都是需要用到这个类的。
2、BitMap:位图,它的作用是对像素做一些行和列的操作,这是在图像处理中要用到的。
3、Canvas:画布,如果要绘画自然少不了画布这个关键的部分。
4、Paint:画笔,在画布上画图必然需要画笔,画笔还可以设置颜色等。上述的Canvas和此Paint组合在一起类似于JavaSE中的Graphics类。
5、Handler:处理器的作用是处理UI更新的信息,并实现更新。
实现多线程生成小球
1、功能:在屏幕上任意处点击,会在该处生成一个小球,球会不断变大,颜色也随之不断变化。可连续点击生成多个小球。
2、实现思路:每点击一下new一个球的对象,同时开启一个线程去修改它的属性,递交给Handler更新显示。
3、代码实现:
xml:
<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"
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=".DrawActivity" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentRight="true" />
</RelativeLayout>
DrawActivity:
public class DrawActivity extends Activity {
private ImageView ivDraw; //图像视图显示图片
private Bitmap bitMap; //位图,类似于画框,可以对图片做行列处理
private Canvas canvas; //画布
private Paint p; //画笔
DrawHandler dh; //处理器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_draw);
ivDraw=(ImageView)this.findViewById(R.id.imageView1);
ivDraw.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX();
float y = event.getY();
int action = event.getAction();
Log.v("DrawActionActivity", "x:"+x+"y:"+"action:"+action);
if(action==MotionEvent.ACTION_DOWN){
if(bitMap==null){
bitMap=bitMap.createBitmap(ivDraw.getWidth(),ivDraw.getHeight(),Config.ARGB_8888);
}
ivDraw.setImageBitmap(bitMap);//在组件上设置位图
canvas=new Canvas(bitMap); //在位图上获取画布
dh=new DrawHandler(canvas, ivDraw);
}
Log.v("DrawApp", "x:"+x+"y:"+y);
DrawShap ds = new DrawShap(x, y, 30);
drawThread dt = new drawThread(ds,dh);
dt.start();
return false;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.draw, menu);
return true;
}
}
/**
* 小球类,保存小球的信息
* @author mayifan
*
*/
class DrawShap{
public float x;
public float y;
public float r;
public int color;
public DrawShap(float x ,float y,float r){
this.x=x;
this.y=y;
this.r=r;
}
}
/**
* 处理器类,负责更新显示
* @author mayifan
*
*/
class DrawHandler extends Handler{
private Canvas canvas;
private ImageView ivDraw;
public DrawHandler(Canvas canvas,ImageView ivDraw){
this.canvas=canvas;
this.ivDraw=ivDraw;
}
public void handleMessage(Message msg){
DrawShap drawShap = (DrawShap)msg.obj;
Paint paint = new Paint();
paint.setColor(drawShap.color);
canvas.drawCircle(drawShap.x, drawShap.y, drawShap.r, paint);
ivDraw.invalidate();//刷新显示
}
}
/**
* 线程类,负责修改参数
* @author mayifan
*
*/
class drawThread extends Thread{
private DrawShap ds;
private DrawHandler dh;
public drawThread(DrawShap ds, DrawHandler dh) {
this.ds=ds;
this.dh=dh;
}
public void run(){
ds.color=Color.BLUE;
for(int i=0;i<50;i++){
ds.color-=i*5;
ds.r+=i;
Message msg=dh.obtainMessage();
msg.obj=ds;
dh.sendMessage(msg);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
效果:
修改MainActivity的方法
有时需要指定某个activity为第一个启动activity,这时需要在Manifest中修改MainActivity。代码如下:
<activity
android:name="com.example.firstandroid0117.DrawActivity"
android:label="@string/title_activity_draw" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
下面这部分决定了它是启动的第一个activity:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>