android+onTouchEventView+背景图片 在android上对一幅背景图片进行划线
(2011-11-30 16:20:39)标签: | 分类: |
下面一段程序用于在android上对一幅背景图片进行划线(包括曲线在内)。
分析:
使用view类和onTouchEvent来实现。
新建一个CircleView 类,这个类继承View类,在这个类中覆写了onDraw(),并通过调用一个线程来时刻刷新界面(postInvalidate),界面上的东东全部在onDraw()函数中。onDraw()函数中的canvas.drawBitmap(resizedBitmap1,0,0,paint)表示将resizedBitmap1画在画布canvas上。由前面的对于canvas的设置知道,我们新建了一个 Bitmap resizedBitmap1 ,并将其作为canvas的背景画布,通过对onTouchEvent的监视,将手触信息保存在path中,并通过这个调用:canvas.drawPath(path, paint),将path画在画布上。我们实例化CircleView mGameView = new CircleView(this); ,并设置背景图片( mGameView.setBackgroundDrawable(getResources().getDrawable(R.drawable.logo) )),因此就实现了对一幅背景图片进行划线。
package cn.mydraw.rxm;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
public class MydrawActivity extends Activity {
Path path = new Path();
private CircleView mGameView =null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
mGameView = new CircleView(this);
mGameView.setBackgroundDrawable(getResources().getDrawable(R.drawable.logo) );//设置的背景图片
setContentView(mGameView);
}
class CircleView extends View implements Runnable{
int x,y;
Canvas canvas;
Bitmap resizedBitmap1 ;
Paint paint;
DisplayMetrics dm = new DisplayMetrics();
CircleView(Context context)//构造函数
{
super(context);
getWindowManager().getDefaultDisplay().getMetrics(dm); // 获取手机屏幕的大小
int view_w = dm.widthPixels;
int view_h = dm.heightPixels;
paint=new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
resizedBitmap1 = Bitmap.createBitmap(view_w, view_h, Config.ARGB_8888);
canvas = new Canvas(resizedBitmap1);//第一步:构造函数中,将resizedBitmap1作为画布背景
new Thread(this).start();
}
public boolean onTouchEvent(MotionEvent event)
{
x=(int) event.getX();
y=(int) (event.getY()-40);
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
path.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
path.lineTo(x, y);
canvas.drawPath(path, paint);//第二步:指定轨迹画图,将path画在画布上
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(resizedBitmap1,0,0,paint);//第三步:时刻显示画布上的布景
}
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
try
{
Thread.sleep(20);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
// 使用postInvalidate可以直接在线程中更新界面
postInvalidate();
}
}
}
}