绘制矩形
MyView:
package com.example.demo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
public class MyView extends View {
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();//定义画笔
paint.setColor(0xffff6600);//如果不设置透明度默认是透明的
paint.setStyle(Paint.Style.FILL);//设置填充方式
canvas.drawRect(10,10,280,150,paint);//绘制矩形
}
}
mainActivity:
package com.example.demo;
import android.content.ComponentName;
import android.content.Intent;
import android.media.Image;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.*;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FrameLayout frameLayout=findViewById(R.id.framelayout);
frameLayout.addView(new MyView(MainActivity.this));
}
}
绘制几何图形
MyView:
package com.example.drawandroid;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;
public class MyView extends View {
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
paint.setAntiAlias(true);//采用抗锯齿功能
paint.setColor(0xffa4c739);//绿色
//绘制头部
RectF rectF=new RectF(10,10,100,100);//定义外轮廓矩形
rectF.offset(90,20);
canvas.drawArc(rectF,-10,-160,false,paint);
//绘制眼睛
paint.setColor(0xffffffff);
canvas.drawCircle(165,53,4,paint);
canvas.drawCircle(125,53,4,paint);
//绘制天线
paint.setStrokeWidth(2);//设置笔触的宽度
paint.setColor(0xffa4c739);
canvas.drawLine(110,15,125,35,paint);
canvas.drawLine(180,15,165,35,paint);
//绘制身体
canvas.drawRect(100,75,190,150,paint);//绘制矩形
RectF rectF_body=new RectF(100,140,190,160);
canvas.drawRoundRect(rectF_body,10,10,paint);//绘制圆角矩形
//绘制胳膊
RectF rectF_arm=new RectF(75,75,95,140);
canvas.drawRoundRect(rectF_arm,10,10,paint);//绘制圆角矩形
rectF_arm.offset(120,0);
canvas.drawRoundRect(rectF_arm,10,10,paint);//绘制圆角矩形
//绘制腿部
RectF rectF_leg=new RectF(115,150,135,200);
canvas.drawRoundRect(rectF_leg,10,10,paint);//绘制圆角矩形
rectF_leg.offset(40,0);
canvas.drawRoundRect(rectF_leg,10,10,paint);//绘制圆角矩形
}
}
绘制文本
MyView:
package com.example.drawtext;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
public class MyView extends View {
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制对白
Paint paint=new Paint();
paint.setColor(0xff000000);//黑色
paint.setAntiAlias(true);//采用抗锯齿
paint.setTextAlign(Paint.Align.LEFT);//设置文字对齐方式
paint.setTextSize(20);//设置文字大小
canvas.drawText("你想和我一起",175,160,paint);
canvas.drawText("去探险吗",175,175,paint);
canvas.drawText("不,我不想去",245,45,paint);
}
}
设置横屏显示:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置横屏显示
绘制图片
package com.example.drawpicture;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Environment;
import android.view.View;
import android.widget.Toast;
import androidx.core.app.ActivityCompat;
public class MyView extends View {
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
String path= Environment.getExternalStorageDirectory()+"/pyy.jpeg";
Bitmap bitmap= BitmapFactory.decodeFile(path);//创建位图对象
canvas.drawBitmap(bitmap,0,0,paint);
//挖去一小块图片
Bitmap bitmap1=Bitmap.createBitmap(bitmap,23,89,150,168);//创建新位图
canvas.drawBitmap(bitmap1,270,50,paint);
}
//挖去一小块图片
//设置读写权限
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"
};
public static void verifyStoragePermissions(Activity activity) {
try {
//检测是否有写的权限
int permission = ActivityCompat.checkSelfPermission(activity,
"android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED) {
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
内部存储访问权限问题
https://blog.csdn.net/qq_42049445/article/details/89704577
https://blog.csdn.net/Life_s/article/details/108284894
绘制路径
package com.example.drawtext;
import android.content.Context;
import android.graphics.*;
import android.os.Environment;
import android.view.View;
public class MyView extends View {
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
paint.setAntiAlias(true);//设置抗锯齿
paint.setColor(0xff0000ff);//蓝色
paint.setStyle(Paint.Style.STROKE);//设置填充样式为描边
Path path=new Path();
path.addCircle(150,100,50,Path.Direction.CW);//创建圆形路径
//canvas.drawPath(path,paint);//绘制路径
canvas.drawTextOnPath("或者就是为了改变世界",path,0,0,paint);//绘制绕路径的文本
}
}
逐帧动画
在res目录下创建动画资源目录anim,创建动画资源文件:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/giao1" android:duration="600"/>
<item android:drawable="@drawable/giao2" android:duration="600"/>
<item android:drawable="@drawable/giao3" android:duration="600"/>
<item android:drawable="@drawable/giao4" android:duration="600"/>
<item android:drawable="@drawable/giao5" android:duration="600"/>
<item android:drawable="@drawable/giao6" android:duration="600"/>
<item android:drawable="@drawable/giao7" android:duration="600"/>
<item android:drawable="@drawable/giao8" android:duration="600"/>
<item android:drawable="@drawable/giao9" android:duration="600"/>
<item android:drawable="@drawable/giao10" android:duration="600"/>
</animation-list>
文件会报错,不用理会。
在布局问价中添加动画:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearlayout"
android:orientation="vertical"
android:background="@anim/fairy"
tools:context=".MainActivity">
</LinearLayout>
//设置动画播放个暂停:
package com.example.animfairy;
import android.graphics.drawable.AnimationDrawable;
import android.view.View;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private boolean flag=true;//记录播放状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout linearLayout=findViewById(R.id.linearlayout);
final AnimationDrawable animationDrawable= (AnimationDrawable) linearLayout.getBackground();//获取动画资源
linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(flag)
{
animationDrawable.start();
flag=false;
}
else
{
animationDrawable.stop();
flag=true;
}
}
});
}
}
透明度渐变动画
定义动画资源文件:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="0"
android:toAlpha="1"
android:duration="2000"/>
</set>
设置动画资源文件:
package com.example.animfairy;
import android.graphics.drawable.AnimationDrawable;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private boolean flag=true;//记录播放状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView imageView=findViewById(R.id.image);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Animation animation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha);//创建动画对象
imageView.startAnimation(animation);
}
});
}
}
旋转动画
定义动画资源:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"/>
</set>
设置动画资源:
package com.example.animfairy;
import android.graphics.drawable.AnimationDrawable;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private boolean flag=true;//记录播放状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView imageView=findViewById(R.id.image);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Animation animation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate);//创建动画对象
imageView.startAnimation(animation);
}
});
}
}
缩放动画
定义动画资源:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale android:fromXScale="1"
android:fromYScale="1"
android:toXScale="2"
android:toYScale="2"
android:pivotY="50%"
android:pivotX="50%"
android:duration="2000"/>
</set>
设置动画资源:
package com.example.animfairy;
import android.graphics.drawable.AnimationDrawable;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private boolean flag=true;//记录播放状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView imageView=findViewById(R.id.image);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Animation animation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale);//创建动画对象
imageView.startAnimation(animation);
}
});
}
}
平移动画
定义动画资源:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="300"
android:toYDelta="300"
android:duration="2000"/>
</set>
设置动画资源:
package com.example.animfairy;
import android.graphics.drawable.AnimationDrawable;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private boolean flag=true;//记录播放状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView imageView=findViewById(R.id.image);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Animation animation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.translate);//创建动画对象
imageView.startAnimation(animation);
}
});
}
}
淡入淡出动画切换相册
定义动画资源:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="1"
android:toAlpha="0"
android:duration="4000"/>
</set>
mainactivuty:
package com.example.slideimage;
import android.media.Image;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener{
ViewFlipper viewFlipper;
GestureDetector detector;//定义手势检测器
final int distance=50;//定义手势动作两点之间的最小距离
//定义图片数组
private int[] images=new int[]{R.drawable.giao1,R.drawable.giao2,R.drawable.giao3,R.drawable.giao4,R.drawable.giao5,
R.drawable.giao6,R.drawable.giao7,R.drawable.giao8,R.drawable.giao9,R.drawable.giao10};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
detector=new GestureDetector(this, this);
viewFlipper=findViewById(R.id.flipper);
for(int i=0;i<images.length;i++)
{
ImageView imageView=new ImageView(this);
imageView.setImageResource(images[i]);
viewFlipper.addView(imageView);//加载图片
}
//定义并初始化动画数组
Animation[] animations=new Animation[2];
animations[0]= AnimationUtils.loadAnimation(this,R.anim.anim_alpha_in);//淡入动画
animations[1]= AnimationUtils.loadAnimation(this,R.anim.anim_alpha_out);//淡出动画
//指定切换的动画
viewFlipper.setInAnimation(animations[0]);
viewFlipper.setOutAnimation(animations[1]);
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return detector.onTouchEvent(event);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//通过x坐标判断是向左滑动还是向右滑动
//右向左
if(e1.getX()-e2.getX()>distance)
{
viewFlipper.showPrevious();
return true;
}
else if(e2.getX()-e1.getX()>distance)
{
viewFlipper.showPrevious();
return true;
}
return false;
}
}