天天看點

Android View上繪制圖形和圖檔的總結

近期用了一下View上繪畫,在總結一下:

其實都是直接使用sdk中提供的接口

繪制圖形的例子

package com.cby.jason.draw2d;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by Jason on 2016/2/27.
 */
public class DrawGraphicalView extends View{

    private Paint paint1 = new Paint();
    private Paint paint2 = new Paint();

    public DrawGraphicalView(Context context) {
        super(context);
        initView();
    }

    public DrawGraphicalView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    private void initView() {
        //初始化
        paint1.setColor(Color.RED);
        paint1.setStrokeWidth(10f);
        paint2.setColor(Color.YELLOW);
        paint2.setStrokeWidth(20f);
        paint2.setStyle(Paint.Style.STROKE);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //畫像素點
        canvas.drawPoint(100,80,paint1);
        canvas.drawPoint(100, 100, paint2);
        canvas.drawPoints(new float[]{100, 120, 100, 140}, paint1);
        //畫線
        canvas.drawLine(10,10,200,10,paint1);
        canvas.drawLine(10, 40, 200, 40, paint2);
        //用線畫三角形
        canvas.drawLines(new float[]{160, 100, 80, 250, 160, 100, 240, 250, 80, 250, 240, 250}, paint1);
        //畫矩形
        canvas.drawRect(80,300,380,600,paint1);
        canvas.drawRect(40,260,440,640,paint2);
        Rect r = new Rect(100,320,360,580);
        Paint p = new Paint();
        p.setStrokeWidth(10f);
        p.setStyle(Paint.Style.STROKE);
        p.setColor(Color.BLUE);
        canvas.drawRect(r, p);

        //畫弧
        canvas.drawArc(480, 300, 880, 600, 15f, 220f, false, paint1);
        canvas.drawArc(40, 660, 440, 1040, 30, 150, true, paint2);
        RectF r1 = new RectF(480, 660, 880, 1040);
        canvas.drawArc(r1, 15f, 220f, true, paint1);

        //畫圓
        canvas.drawCircle(600, 120, 100f, paint1);
        //畫橢圓
        canvas.drawArc(450, 20, 750, 220, 0, 360, false, paint2);
        //畫文字
        canvas.drawText("what are words",66,1200,new Paint(Color.BLACK));
        canvas.drawText("what are words",3,9,66,1250,new Paint(Color.BLACK));
        Paint p1 = new Paint(Color.BLACK);
        p1.setTextSize(25);//設定文字大小
        canvas.drawText("what are words",66,1300,p1);
        //
        canvas.drawOval(150,1300,300,1450,p1);
    }
}
           

在View上繪制位圖的例子:

package com.cby.jason.draw2d;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;

import java.io.InputStream;

/**
 * Created by Jason on 2016/2/28.
 */
public class DrawBitmapView extends View {

    private Bitmap mBitmap;
    private Bitmap bm;
    private InputStream is;
    private Context mContext;

    public DrawBitmapView(Context context) {
        super(context);
        initView(context);
    }

    public DrawBitmapView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    private void initView(Context context){
        mContext = context;
        is = context.getResources().openRawResource(R.raw.ic_folders);
        BitmapFactory.Options opt = new BitmapFactory.Options();
        opt.inSampleSize = 2;
        mBitmap = BitmapFactory.decodeStream(is, null, opt);
        bm = drawableToBitamp(mContext.getResources().getDrawable(R.drawable.cross));
    }

    int disgree= 0;
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(mBitmap, 100, 100, null);

        //drawableToBitamp(mContext.getResources().getDrawable(R.drawable.ic_launcher));
        Drawable d = mContext.getResources().getDrawable(R.drawable.ic_launcher);
        int w = d.getIntrinsicWidth();
        int h = d.getIntrinsicHeight();
        d.setBounds(300, 200, 300 + w, 200 + h);
        d.draw(canvas);

        Matrix matrix = new Matrix();
        if(disgree > 360){
            disgree = 0;
        }
        disgree++;
        float px;
        float py;
        px = bm.getWidth()/2;
        py = bm.getHeight()/2;
        matrix.setRotate(disgree, px, py);
        //canvas.setMatrix(matrix);
        //canvas.drawBitmap(bm,550,550,null);

        canvas.drawBitmap(bm,matrix,null);
        invalidate();

    }


    private Bitmap drawableToBitamp(Drawable drawable)
    {
        Bitmap bitmap;
        int w = drawable.getIntrinsicWidth();
        int h = drawable.getIntrinsicHeight();
        System.out.println("Drawable轉Bitmap");
        Bitmap.Config config =
                drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                        : Bitmap.Config.RGB_565;
        bitmap = Bitmap.createBitmap(w,h,config);
        //注意,下面三行代碼要用到,否在在View或者surfaceview裡的canvas.drawBitmap會看不到圖
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, w, h);
        drawable.draw(canvas);
        return bitmap;
    }
}