1.绘制简单图形
使用paint 和Canvas类进行图形操作
绘图操作支持类
2.绘制一个圆形
1、创建一个自己的MyView类继承自View
绘制一个圆形
public class MyView extends View {
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
Paint paint=new Paint();
paint.setColor(Color.BLUE);
canvas.drawCircle(30,50,25,paint);
super.onDraw(canvas);
}
}
**2、在布局中引入这个自定义的View,实际上就引入常用控件没有大区别
注意这里引入的是:com.fengray.myex021graphic.Myview组件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.fengray.myex021graphic.MyView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>**
3、主activity:
暂不需要:
结果:
3.绘制一个矩形
canvas.drawRect(80,20,160,80,paint);
4.绘制一个矩形框
Rect rect=new Rect();
rect.set(180,20,300,80);
paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(rect,paint);
5.绘制一个文本框
paint.setColor(Color.RED);
paint.setTextSize(30);
canvas.drawText("北京fengray科技有限",40,160,paint);
6.绘制一个直线
canvas.drawLine(10,120,300,120,paint);
7.绘制一个椭圆
RectF oval=new RectF();
oval.set(10.0f,240.0f,210.0f,300.0f);
canvas.drawOval(oval,paint);
8.绘制一个圆弧
oval=new RectF();
oval.set(250.0f,440.0f,310.0f,600.0f);
canvas.drawArc(oval,150.0f,140.0f,true,paint);
以上所有案例代码activity部分
public class MyView extends View {
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
Paint paint=new Paint();
paint.setColor(Color.BLUE);
canvas.drawCircle(30,50,25,paint);
canvas.drawRect(80,20,160,80,paint);
Rect rect=new Rect();
rect.set(180,20,300,80);
paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(rect,paint);
paint.setColor(Color.RED);
paint.setTextSize(30);
canvas.drawText("北京fengray科技有限",40,160,paint);
canvas.drawLine(10,300,300,300,paint);
RectF oval=new RectF();
oval.set(10.0f,240.0f,210.0f,300.0f);
canvas.drawOval(oval,paint);
oval=new RectF();
oval.set(250.0f,440.0f,310.0f,600.0f);
canvas.drawArc(oval,150.0f,140.0f,true,paint);
super.onDraw(canvas);
}
}
结果是:
8.Bitmap组件
1、创建属于自己的view组件MyView ,继承View
public class MyView extends View {
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
Bitmap bitmap= BitmapFactory.decodeResource(getResources(), R.drawable.girl);
Paint paint=new Paint();
paint.setAntiAlias(true);//消除锯齿
canvas.drawBitmap(bitmap,0,0,paint);
paint.setColor(Color.BLUE);//底色
paint.setTextSize(60);
canvas.drawText("图片高度为:"+ bitmap.getWidth()+",图片高度:"+bitmap.getHeight(),10,bitmap.getHeight()+80,paint);
super.onDraw(canvas);
}
}
2、布局中引入自定义的Myview组件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.fengray.myex022bitmap.MyView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
3、主activity无需输入
结果:
9.使用图片填充屏幕
同上例,修改Myview类为:
public class MyView extends View {
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
DisplayMetrics dm=getResources().getDisplayMetrics();
int screenWidth=dm.widthPixels;
int screenHight=dm.heightPixels;
Bitmap bitmap= BitmapFactory.decodeResource(getResources(), R.drawable.girl);
bitmap=Bitmap.createScaledBitmap(bitmap,screenWidth,screenHight,true);
Paint paint=new Paint();
paint.setAntiAlias(true);//消除锯齿
canvas.drawBitmap(bitmap,0,0,paint);
super.onDraw(canvas);
}
}
结果:照片被拉伸
10.局部使用图片(指定位置使用图片)
上上例中修改MyView类
public class MyView extends View {
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
Bitmap bitmap= BitmapFactory.decodeResource(getResources(), R.drawable.girl);
Paint paint=new Paint();
paint.setAntiAlias(true);//消除锯齿
canvas.drawBitmap(bitmap,null,new Rect(30,50,600,1200),paint);//按照30,50,600,1200切图,按照左上下右的顺序
super.onDraw(canvas);
}
}
结果是:
11.Matrix
1.创建Myview类,继承View类
public class MyView extends View {
private Bitmap bitmap=null;
private Matrix matrix=new Matrix();
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context,attrs);
bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.logo);
//以下各种缩放,反正我是看不懂
float cosValue= (float) Math.cos(-Math.PI/3);//60弧度
float sinValue= (float) Math.sin(-Math.PI/3);
matrix.setValues(new float[]{cosValue,-sinValue,700,sinValue,cosValue,800,0,0,2});
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bitmap,matrix,null);
super.onDraw(canvas);
}
}
2.创建布局文件
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.fengray.myex023matrix.MyView
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
3、主activity文件为空
结果为:图片产生了旋转
另外一种旋转,myview类如下:
public class MyView extends View {
private Bitmap bitmap=null;
private Matrix matrix=new Matrix();
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context,attrs);
bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.logo);
//以下各种缩放,反正我是看不懂
float cosValue= (float) Math.cos(-Math.PI/3);
float sinValue= (float) Math.sin(-Math.PI/3);
matrix.preScale(0.5f,0.5f,50,100);
matrix.preRotate(-60,500,1000);
matrix.preTranslate(500,1000);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bitmap,matrix,null);
super.onDraw(canvas);
}
}
结果如下: