安卓学习日记——画布与绘制

先提一下Draw 9-patch
老版本的Android Studio是在SDK目录下的Tools里有个draw9patch
在这里插入图片描述
新版Android Studio是可以在AS里直接创建的(一开始没在目录下找到我也是一脸懵逼)
在这里插入图片描述
与传统的png格式图片相比,9.png格式图片在图片四周有一圈一个像素点组成的边沿,该边沿用于对图片的可扩展区和内容显示区进行定义。这种格式的图片在android环境下具有自适应调节大小的能力。
给.9图片划线,指的是通过划线,决定图片的可拉伸区域和显示文本信息的区域。其中,上方和左方的线是控制图片的可拉伸区域的,也就是说,上方的线控制图片横向可拉伸,左侧的线控制纵向可拉伸。下方的线和右侧的线控制图片的文本区域,也就是说,如果图片上有text,就会把位置控制在下方和右侧的线围成的区域里、如果想删除划线,安卓shift+鼠标左键,删除划线。

用画布画一个图片

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;

public class MyImageView extends View {
    public MyImageView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint p=new Paint();
        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.x);
        canvas.drawBitmap(bitmap,0,0,p);

    }
}
setContentView(new MyImageView(this));

在这里插入图片描述
画2d图形

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Shader;
import android.os.Parcel;
import android.view.View;

/**
 * 自定义一个组件
 */
public class MyView extends View {
    public MyView(Context context) {
        super(context);
    }


    //会在组件加载时调用
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);
        Paint paint=new Paint();
        //去锯齿
        paint.setAntiAlias(true);
        //设置paint的颜色
        paint.setColor(Color.RED);
        //设置paint的style为STROKE:空心
        paint.setStyle(Paint.Style.STROKE);
        //设置paint的外框宽度
        paint.setStrokeWidth(3);
        //画一个空心圆形
        //参数:圆心X,圆心Y,半径r,paint
        canvas.drawCircle(40,40,30,paint);
        //画一个空心正方形
        //参数:left top right bottom,当right-left等于bottom-top就为正方形
        canvas.drawRect(10,90,70,150,paint);
        //画一个空心长方形
        canvas.drawRect(10,170,70,200,paint);
        //画一个空心椭圆形
        RectF re=new RectF(10,220,70,250);
        canvas.drawOval(re,paint);
        //画一个空心三角形
        Path path=new Path();
        path.moveTo(10,330);
        path.lineTo(70,330);
        path.lineTo(40,270);
        path.close();
        canvas.drawPath(path,paint);
        //画一个空心梯形
        Path path1=new Path();
        path1.moveTo(10,410);
        path1.lineTo(70,410);
        path1.lineTo(55,350);
        path1.lineTo(25,350);
        path1.close();
        canvas.drawPath(path1,paint);
        //设置paint的style为FILL:实心
        paint.setStyle(Paint.Style.FILL);
        //设置paint的颜色
        paint.setColor(Color.BLUE);
        //画一个实心圆
        canvas.drawCircle(120,40,30,paint);
        //画一个实心正方形
        canvas.drawRect(90,90,150,150,paint);
        //画一个实心长方形
        canvas.drawRect(90,170,150,200,paint);
        //画一个实心椭圆
        RectF re2=new RectF(90,220,150,250);
        canvas.drawOval(re2,paint);
        //画一个实心三角形
        Path path2=new Path();
        path2.moveTo(90,330);
        path2.lineTo(150,330);
        path2.lineTo(120,270);
        path2.close();
        canvas.drawPath(path2,paint);
        //画一个实心梯形
        Path path3=new Path();
        path3.moveTo(90,410);
        path3.lineTo(150,410);
        path3.lineTo(135,350);
        path3.lineTo(105,350);
        path3.close();
        canvas.drawPath(path3,paint);
        //设置渐变色
        Shader mShader=new LinearGradient(0,0,100,100,new int[]{
                    Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW
        },null,Shader.TileMode.REPEAT);
        paint.setShader(mShader);
        //画一个渐变色圆
        canvas.drawCircle(200,40,30,paint);
        //画一个渐变色正方形
        canvas.drawRect(170,90,230,150,paint);
        //画一个渐变色长方形
        canvas.drawRect(170,170,230,200,paint);
        //画一个渐变色椭圆
        RectF re3=new RectF(170,220,230,250);
        canvas.drawOval(re3,paint);
        //画一个渐变色三角形
        Path path4=new Path();
        path4.moveTo(170,330);
        path4.lineTo(230,330);
        path4.lineTo(200,270);
        path4.close();
        canvas.drawPath(path4,paint);
        //画一个渐变色梯形
        Path path5=new Path();
        path5.moveTo(170,410);
        path5.lineTo(230,410);
        path5.lineTo(215,350);
        path5.lineTo(185,350);
        path5.close();
        canvas.drawPath(path5,paint);
        //写字
        paint.setTextSize(24);
        canvas.drawText("圆形",240,50,paint);
        canvas.drawText("正方形",240,120,paint);
        canvas.drawText("长方形",240,190,paint);
        canvas.drawText("椭圆形",240,250,paint);
        canvas.drawText("三角形",240,320,paint);
        canvas.drawText("梯形",240,390,paint);
    }
}
setContentView(new MyView(this));

在这里插入图片描述
SurfaceView
单独在自己的窗口绘制

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder holder;
    private MyThread thread;
    public MySurfaceView(Context context) {
        super(context);
        holder=this.getHolder();
        holder.addCallback(this);
    }
    class MyThread implements Runnable{
        private SurfaceHolder holder;
        public boolean isRun;
    public MyThread(SurfaceHolder holder){
        this.holder=holder;
        isRun=true;
    }
        @Override
        public void run() {
        int count=0;

        while(isRun){
            Canvas canvas=null;
            try {
            synchronized (holder){
                canvas=holder.lockCanvas();
                canvas.drawColor(Color.BLACK);
                Paint p=new Paint();

                p.setColor(Color.RED);
                p.setAntiAlias(true);
                p.setStyle(Paint.Style.FILL);
                canvas.drawRect(10,10,100,100,p);
                p.setTextSize(30);
                canvas.drawText("当前是第 "+(count++)+" 秒",10,150,p);
                    Thread.sleep(1000);
            }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                holder.unlockCanvasAndPost(canvas);
            }
        }

        }
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        thread=new MyThread(holder);
        thread.isRun=true;
        new Thread(thread).start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {


    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        thread.isRun=false;

    }
}

在这里插入图片描述
SurfaceView播放视频

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

import java.io.IOException;

public class VideoActivity extends AppCompatActivity implements SurfaceHolder.Callback {
    private SurfaceView surfaceView;
    private SurfaceHolder holder;
    private MediaPlayer mp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);
        surfaceView=findViewById(R.id.surfaceView);
        holder=surfaceView.getHolder();
        holder.addCallback(this);
        holder.setFixedSize(320,220);
    }
    public void playClick(View view){
        mp.start();
    }
    public void pauseClick(View view){
        mp.pause();
    }
    public void stopClick(View view){
        mp.stop();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mp=new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setDisplay(holder);
        String path= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)+"/2.mp4";
        try {
            mp.setDataSource(path);//设置播放视频源
            mp.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if(mp!=null){
            if(mp.isPlaying()){
                mp.stop();
                mp.release();
            }
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mp!=null){
            if(mp.isPlaying()){
                mp.stop();
                mp.release();
            }
        }
    }
}

添加权限

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/chen_xiaoke/article/details/89383673