Android App开发动画特效中遮罩动画的讲解及实战演示(附源码 简单易懂 可直接使用)

简介: Android App开发动画特效中遮罩动画的讲解及实战演示(附源码 简单易懂 可直接使用)

需要图片集和源码请点赞关注收藏后评论区留言~~~

一、画布的绘图层次

画布Canvas上的绘图层次都是在同一个图层上进行的,这意味着如果存在重叠区域,后面绘制的图形就必然覆盖前面的图形。绘图是比较复杂的事情,不是直接覆盖这么简单,有些特殊的绘图操作往往需要做与或非等运算。

Android给画布的图层显示指定了许多规则,详细的图层显示规则如下图

当然 光看图层规则的文案还是比较令人费解 下面我们看直观的效果,圆圈是先绘制的下层图形,正方形是后绘制的上层图形,图例展示了运用不同规则时的显示画面

具体到编码而言 需要在当前画布之外再准备一个遮罩画布,遮罩画布绘制上层图形,而当前画布绘制下层图形,同时指定两个画布的混合图层模式,并根据该模式在当前画布盖上遮罩画布

然后在布局文件中添加LayerView节点,并在对应的活动页面调用setMode方法设置绘图模式,运行并测试该App,可观察到图层覆盖效果

代码如下

Java类

package com.example.animation;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import com.example.animation.widget.LayerView;
public class DrawLayerActivity extends AppCompatActivity {
    private LayerView lv_mode; // 声明一个层次视图对象
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_draw_layer);
        lv_mode = findViewById(R.id.lv_mode);
        initLayerSpinner(); // 初始化绘图层次类型下拉框
    }
    // 初始化绘图层次类型下拉框
    private void initLayerSpinner() {
        ArrayAdapter<String> modeAdapter = new ArrayAdapter<>(this,
                R.layout.item_select, descArray);
        Spinner sp_mode = findViewById(R.id.sp_mode);
        sp_mode.setPrompt("请选择绘图层次类型");
        sp_mode.setAdapter(modeAdapter);
        sp_mode.setOnItemSelectedListener(new ModeSelectedListener());
        sp_mode.setSelection(0);
    }
    private String[] descArray = {
            "只显示轮廓", "SRC 只显示上层图形", "DST 只显示下层图形",
            "SRC_OVER 重叠部分由上层遮盖下层", "DST_OVER 重叠部分由下层遮盖上层",
            "SRC_IN 只显示重叠部分的上层图形", "DST_IN 只显示重叠部分的下层图形",
            "SRC_OUT 只显示上层图形的未重叠部分", "DST_OUT 只显示下层图形的未重叠部分",
            "SRC_ATOP 只显示上层图形区域,但重叠部分显示下层图形", "DST_ATOP 只显示下层图形区域,但重叠部分显示上层图形",
            "XOR 不显示重叠部分,其余部分正常显示", "DARKEN 重叠部分按颜料混合方式加深,其余部分正常显示",
            "LIGHTEN 重叠部分按光照重合方式加亮,其余部分正常显示", "MULTIPLY 只显示重叠部分,且重叠部分的颜色混合加深",
            "SCREEN 过滤重叠部分的深色,其余部分正常显示"};
    private PorterDuff.Mode[] modeArray = {
            PorterDuff.Mode.CLEAR, PorterDuff.Mode.SRC, PorterDuff.Mode.DST,
            PorterDuff.Mode.SRC_OVER, PorterDuff.Mode.DST_OVER,
            PorterDuff.Mode.SRC_IN, PorterDuff.Mode.DST_IN,
            PorterDuff.Mode.SRC_OUT, PorterDuff.Mode.DST_OUT,
            PorterDuff.Mode.SRC_ATOP, PorterDuff.Mode.DST_ATOP,
            PorterDuff.Mode.XOR, PorterDuff.Mode.DARKEN,
            PorterDuff.Mode.LIGHTEN, PorterDuff.Mode.MULTIPLY,
            PorterDuff.Mode.SCREEN};
    class ModeSelectedListener implements AdapterView.OnItemSelectedListener {
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            if (arg2 == 0) {
                lv_mode.setOnlyLine(); // 只显示线条轮廓
            } else {
                lv_mode.setMode(modeArray[arg2]); // 设置层次视图的绘图模式
            }
        }
        public void onNothingSelected(AdapterView<?> arg0) {}
    }
}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="绘图模式:"
            android:textColor="@color/black"
            android:textSize="17sp" />
        <Spinner
            android:id="@+id/sp_mode"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:spinnerMode="dialog" />
    </LinearLayout>
    <com.example.animation.widget.LayerView
        android:id="@+id/lv_mode"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:background="@color/white" />
</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
1月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
238 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
204 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
523 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
489 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
1月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
122 0
|
2月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
198 6
|
4月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
355 11
|
4月前
|
存储 Android开发 数据安全/隐私保护
Thanox安卓系统增加工具下载,管理、阻止、限制后台每个APP运行情况
Thanox是一款Android系统管理工具,专注于权限、后台启动及运行管理。支持应用冻结、系统优化、UI自定义和模块管理,基于Xposed框架开发,安全可靠且开源免费,兼容Android 6.0及以上版本。
408 4
|
4月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
181 0
下一篇
oss云网关配置