画笔和画布

绘制矩形

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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值