先提一下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"/>