求Android中canvas.drawPicture(p);的使用方法?求一个简单的实例?

 我来答
百度网友192900496
2014-08-04 · TA获得超过120个赞
知道答主
回答量:69
采纳率:0%
帮助的人:44.9万
展开全部

这个可能稍微复杂一点,但是非常实用:


public class MainActivity extends Activity {


DrawingView dv ;   

private Paint       mPaint;

private DrawingManager mDrawingManager=null;


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    dv = new DrawingView(this);

    setContentView(dv);

    mPaint = new Paint();

    mPaint.setAntiAlias(true);

    mPaint.setDither(true);

    mPaint.setColor(Color.GREEN);

    mPaint.setStyle(Paint.Style.STROKE);

    mPaint.setStrokeJoin(Paint.Join.ROUND);

    mPaint.setStrokeCap(Paint.Cap.ROUND);

    mPaint.setStrokeWidth(12);  

}


 public class DrawingView extends View {


        public int width;

        public  int height;

        private Bitmap  mBitmap;

        private Canvas  mCanvas;

        private Path    mPath;

        private Paint   mBitmapPaint;

        Context context;

        private Paint circlePaint;

        private Path circlePath;


        public DrawingView(Context c) {

        super(c);

        context=c;

        mPath = new Path();

        mBitmapPaint = new Paint(Paint.DITHER_FLAG);  

        circlePaint = new Paint();

        circlePath = new Path();

        circlePaint.setAntiAlias(true);

        circlePaint.setColor(Color.BLUE);

        circlePaint.setStyle(Paint.Style.STROKE);

        circlePaint.setStrokeJoin(Paint.Join.MITER);

        circlePaint.setStrokeWidth(4f); 


}


        @Override

         protected void onSizeChanged(int w, int h, int oldw, int oldh) {

        super.onSizeChanged(w, h, oldw, oldh);


        mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

        mCanvas = new Canvas(mBitmap);


        }

        @Override

        protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);


        canvas.drawBitmap( mBitmap, 0, 0, mBitmapPaint);


        canvas.drawPath( mPath,  mPaint);


        canvas.drawPath( circlePath,  circlePaint);

        }


        private float mX, mY;

        private static final float TOUCH_TOLERANCE = 4;


        private void touch_start(float x, float y) {

        mPath.reset();

        mPath.moveTo(x, y);

        mX = x;

        mY = y;

        }

        private void touch_move(float x, float y) {

        float dx = Math.abs(x - mX);

        float dy = Math.abs(y - mY);

        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {

             mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);

            mX = x;

            mY = y;


            circlePath.reset();

            circlePath.addCircle(mX, mY, 30, Path.Direction.CW);

        }

        }

        private void touch_up() {

        mPath.lineTo(mX, mY);

        circlePath.reset();

        // commit the path to our offscreen

        mCanvas.drawPath(mPath,  mPaint);

        // kill this so we don't double draw

        mPath.reset();

        }


        @Override

        public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();

        float y = event.getY();


        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

                touch_start(x, y);

                invalidate();

                break;

            case MotionEvent.ACTION_MOVE:

                touch_move(x, y);

                invalidate();

                break;

            case MotionEvent.ACTION_UP:

                touch_up();

                invalidate();

                break;

        }

        return true;

        }  

        }

  }


你的手指到哪里,Canvas就画到哪里。图:

更多追问追答
追问
写得非常好,不过drawPicture方法没有用啊
追答
哈哈,我看错了。这个应该可以“

private static class SampleView extends View {
private Picture mPicture;
private Drawable mDrawable;

public SampleView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);

mPicture = new Picture();
mPicture.endRecording();

mDrawable = new PictureDrawable(mPicture);
}

@Override protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
canvas.drawPicture(mPicture, new RectF(0, 100, getWidth(), 200));

mDrawable.setBounds(0, 200, getWidth(), 300);
mDrawable.draw(canvas);

ByteArrayOutputStream os = new ByteArrayOutputStream();
mPicture.writeToStream(os);
InputStream is = new ByteArrayInputStream(os.toByteArray());
canvas.translate(0, 300);
canvas.drawPicture(Picture.createFromStream(is));
}
网上看的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
微测检测
2023-10-30 广告
深圳市微测检测有限公司始创于2005年,是一家综合性、全方位、一站式的权威第三方检测认证公司。自成立以来,Microtest微测检测已成功为上万家企业完成数十万计的产品测试和认证,协助企业的产品畅销全球。Microtest微测检测已建立二十... 点击进入详情页
本回答由微测检测提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式