Android多线程生成小球

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>

猜你喜欢

转载自blog.csdn.net/mayifan_blog/article/details/86551674
今日推荐