自定义View练习题目整理

news2025/7/17 3:12:39

一、动态音频播放柱形图

1、效果图:

在这里插入图片描述

2、步骤

(1)、新建自定义View类,继承View
(2)、重写onDraw()方法,使用画笔和画布循环画一定数量的柱形

   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);

       //画柱形
       for (int i = 0; i < 10; i++){
           float mRandom = (float) Math.random();
           float currentHeight = mRectHeight*mRandom;
          canvas.drawRect((float) (mWidth*0.4/2+mRectWidth * i +offset),currentHeight, (float) (mWidth*0.4/2+mRectWidth*(i+1)),mRectHeight,mPaint1);
       }
       postInvalidateDelayed(800);
   }

(3)、重写onSizeChange()方法,实现柱形的渐变效果

    @Override
   protected void onSizeChanged(int w, int h, int oldw, int oldh) {
       super.onSizeChanged(w, h, oldw, oldh);
       //实现音频柱的渐变效果
       mWidth = getWidth();
       mRectHeight = getHeight();
       mRectWidth = (int) (mWidth*0.6/10);
       mLinearGradient = new LinearGradient(
               0,0,mRectWidth,mRectHeight,Color.YELLOW,Color.BLUE, Shader.TileMode.CLAMP);
       mPaint1.setShader(mLinearGradient);
   }

(4)、在适合的xml布局文件中引入即可

<com.example.test.MyView1
        android:id="@+id/myView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

附:全部代码如下:

package com.example.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.Nullable;

public class MyView1 extends View {

   Paint mPaint1;  //画笔
   int mWidth = 200;
   int mHeight = 1000;
   int mRectWidth = 30; //柱形的宽度
   int mRectHeight = 200; //柱形的高度
   int offset = 5; //柱形之间的距离

   LinearGradient mLinearGradient;

   public MyView1(Context context) {
       super(context);
       init();
   }

   public MyView1(Context context, @Nullable AttributeSet attrs) {
       super(context, attrs);
       init();
   }

   public MyView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
       super(context, attrs, defStyleAttr);
       init();
   }

   private void init(){
   	   //初始化画笔和画笔的颜色、样式等
       mPaint1 = new Paint();
       mPaint1.setColor(getResources().getColor(R.color.purple_200));
   }

   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);

       //画柱形
       for (int i = 0; i < 10; i++){
           float mRandom = (float) Math.random();
           float currentHeight = mRectHeight*mRandom;
          canvas.drawRect((float) (mWidth*0.4/2+mRectWidth * i +offset),currentHeight, (float) (mWidth*0.4/2+mRectWidth*(i+1)),mRectHeight,mPaint1);
       }
       postInvalidateDelayed(800);
   }

   @Override
   protected void onSizeChanged(int w, int h, int oldw, int oldh) {
       super.onSizeChanged(w, h, oldw, oldh);
       //实现音频柱的渐变效果
       mWidth = getWidth();
       mRectHeight = getHeight();
       mRectWidth = (int) (mWidth*0.6/10);
       mLinearGradient = new LinearGradient(
               0,0,mRectWidth,mRectHeight,Color.YELLOW,Color.BLUE, Shader.TileMode.CLAMP);
       mPaint1.setShader(mLinearGradient);
   }
}

二、自定义大小的圆形

1、效果图

一个圆形

2、步骤

(1)新建自定义View类,继承View
(2)可设置自定义属性

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //自定义属性
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);
        mColor = a.getColor(R.styleable.MyView_circle_color,Color.RED);
        a.recycle();
        init();
    }

values文件下面新建attrs.xml,可设置颜色,后续可设置给画笔

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //自定义属性
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);
        mColor = a.getColor(R.styleable.MyView_circle_color,Color.RED);
        a.recycle();
        init();
    }

(3)重写onMeasure(),自定义绘制大小

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //宽测量模式
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        //宽测量大小
        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
        //高测量模式
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        //高测量大小
        int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
        if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(200,200);
        }else if (widthSpecMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(200,heightSpecSize);
        }else if (heightSpecMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(widthSpecSize,200);
        }else{
            setMeasuredDimension(widthMeasureSpec,heightMeasureSpec);
        }
    }

(4)重写onDraw()方法画圆形

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int width = getWidth()-getPaddingLeft()-getPaddingLeft();
        int height = getHeight()-getPaddingLeft()-getPaddingLeft();
        int radius = Math.min(width,height)/2;
        canvas.drawCircle((float) width/2+getPaddingLeft(),(float) height/2+getPaddingLeft(),radius,paint);
    }

(5)相应地方调用需注意设置wrap_content,因为想实现重写onDraw方法中的效果,需要自己支持wrap_content,并且padding也需要自己处理。

<com.example.test.MyView
        android:id="@+id/myView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        app:layout_constraintTop_toBottomOf="@+id/text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

附:全部代码

package com.example.test;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;

public class MyView extends View {

    public int mColor = Color.RED;
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

    public MyView(Context context) {
        super(context);
        init();
    }

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
         init();
    }

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //自定义属性
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);
        mColor = a.getColor(R.styleable.MyView_circle_color,Color.RED);
        a.recycle();
        init();
    }

    //初始化画笔
    private void init(){
        paint.setColor(mColor);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //宽测量模式
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        //宽测量大小
        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
        //高测量模式
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        //高测量大小
        int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
        if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(200,200);
        }else if (widthSpecMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(200,heightSpecSize);
        }else if (heightSpecMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(widthSpecSize,200);
        }else{
            setMeasuredDimension(widthMeasureSpec,heightMeasureSpec);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int width = getWidth()-getPaddingLeft()-getPaddingLeft();
        int height = getHeight()-getPaddingLeft()-getPaddingLeft();
        int radius = Math.min(width,height)/2;
        canvas.drawCircle((float) width/2+getPaddingLeft(),(float) height/2+getPaddingLeft(),radius,paint);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

npm install vue2-ace-editor 安装报错

npm install vue2-ace-editor 安装报错&#xff0c;如下图 目录 npm install vue2-ace-editor 安装报错&#xff0c;如下图 &#x1f9e8;&#x1f9e8;&#x1f9e8;解决方法&#xff1a;在命令后面加上 神秘代码 npm install vue2-ace-editor --save --legacy-peer-deps &a…

该抛弃 x86 Linux,改用 64 位的了

如果你想获得安全的体验&#xff0c;你可能不会再继续使用 32 位 Linux 内核。我们有很多 为 32 位系统定制的 Linux 发行版。那么&#xff0c;为什么我想要不鼓励使用 32 位&#xff0c;而升级到 64 位 Linux 呢&#xff1f;有几个原因&#xff0c;其中一个最大的原因&#xf…

【JavaScript】前端实现电子签名:

文章目录一、效果:二、实现:三、扩展一、效果: 二、实现: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vie…

57 - 深入解析任务调度

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 问题1.1 思考1.2 实例分析&#xff1a;问题分析及解决2. 深入讨论2.1 任务调度的定义2.2 关于调度算法的分类2.3 什么时候进行任务调度2.4 任务的分类2.5 关于优先级调度2.6 问题2.7 调度算法的终极目标2.8 课后扩展1. 问题 系统…

MySQL(二)索引和SQL优化

MySQL进阶MySQL体系结构存储引擎存储引擎特点InnoDB逻辑存储结构MyISAMMemory存储引擎选择索引索引结构二叉树B-TreeBTreeHash索引分类索引语法SQL性能分析工具SQL执行频率慢查询日志profile详情explain索引使用联合索引索引失效情况SQL提示覆盖索引前缀索引单列索引与联合索引…

2023年网红营销10大趋势解读:品牌出海必看

前不久influencermarketinghub发布了《2023年影响者营销基准报告》&#xff0c;报告总结了3500多家营销机构、品牌和其他相关专业人士对当前网红营销现状的看法&#xff0c;以及预测了未来网红营销的一个发展趋势。本期Nox聚星就带领大家详细解读关于2023年网红营销的10大趋势。…

MyBatis学习笔记(三) —— MyBatis核心配置文件详解

3、核心配置文件详解 id是唯一标识&#xff0c;不能重复&#xff0c;但是在真正开发过程中&#xff0c;不可能一个项目中同时使用两个环境&#xff0c;肯定会使用其中的某一个&#xff0c;这时候它的default就比较重要了。 default是设置我们当前使用的默认环境的id <?x…

投票点赞链接制作投票链接在线制作投票图文链接制作点赞

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。“活动星投票”小程序在使…

webpack打包基本原理——实现webpack打包核心功能

webpack打包的基本原理 核心功能就是把我们写的模块化代码转换成浏览器能够识别运行的代码&#xff0c;话不多说我们一起来了解它 首先我们建一个空项目用 npm init -y 创建一个初始化的&#xff0c;在跟目录下创建src文件夹&#xff0c;src下创建index.js&#xff0c;add.js…

日本公派访问学者的具体申请流程

公派日本访问学者的具体申请流程&#xff0c;知识人网整理了相关的资料以供大家参考。第一、申请材料一般申请CSC日本访问学者&#xff0c;截止日是每年的1月15号左右&#xff0c;但是学院在1月10号之前就审查材料了。材料包括&#xff1a;CSC网页的报名表&#xff0c;教授邀请…

Stream——集合数据按照某一字段排序

文章目录前言假设业务场景排序前的准备正序排序1、数据集合的判空 Optional.isPresent()2、使用sort排序3、将排序后的数据流转换为list你以为这样就完了&#xff1f;倒序排序前言 之前&#xff0c;针对Stream链式编程中的几个方法做了大致的说明。详情可以参考&#xff1a; J…

限制Linux指定用户访问某个文件夹,禁止其访问指定文件夹

默认情况下用户本身就只能读写执行自己目录下自己创建的文件&#xff0c;自己主目录以外的文件都没有写权限、执行权限&#xff1b;自己主目录以外的目录&#xff0c;则只有r和x权限&#xff0c;没有w权限&#xff0c;对于合法的ssh用户&#xff0c;这样的权限就已经足够了。 否…

Springboot 整合Flowable工作流框架搭建

我们在开发自动化办公软件时经常会遇到各种审批流程功能&#xff0c;这个使用就需要使用到工作流引擎。目前主流的工作流引擎有Activiti、Flowable、camunda&#xff0c;其中Flowable是在Activiti的基础上开发出来的&#xff0c;基于BPMN2.0协议&#xff0c;它包括 BPMN&#x…

Convolutional Neural Networks for Sentence Classification

摘要 We report on a series of experiments with convolutional neural networks (CNN) trained on top of pre-trained word vectors for sentence-level classification tasks. We show that a simple CNN with little hyperparameter tuning and static vectors achieves e…

安装ROS+ROS命令行工具的使用

1.添加ROS软件源 $ sudosh -c echo "deb http;/packages.ros.org/ros/ubuntu $(sb_release -sc) main">/etc/apt/sources.list.d/ros-latest.list 2.添加密钥 $ sudo apt-key adv --keyserver hkp:/ keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B17…

我希望在 26 岁时知道的 36 岁时知道的职业作弊代码

当您开始抓住您不具备资格的机会时&#xff0c;您的职业生涯就会发展。我像关在笼子里的狮子一样被困在金融事业中。然后通过一系列离奇的事件&#xff0c;我发明了自己的工作。这使我获得了难得的机会&#xff0c;并建立了最终取代我工作的在线业务。这些作弊码让一些人称之为…

I/O 多路复用:select/poll/epoll

url&#xff1a;9.2 I/O 多路复用&#xff1a;select/poll/epoll | 小林coding &#xff08;仅供自己学习使用&#xff09; 为什么要使用I/O多路复用技术 TCP Socket 调用流程是最简单、最基本的&#xff0c;它基本只能一对一通信&#xff0c;因为使用的是同步阻塞的方…

Linux作为主力机--Manjaro 22.0.4

1、对操作系统的看法 个人是做软件开发的&#xff0c;已经使用Manjaro作为主力机两年多了&#xff0c;真的是特别喜欢这个操作系统。经过两年的打磨&#xff0c;个人16年的惠普老电脑加上这个Manjaro 22.0.4操作系统完全可以再战五年&#xff0c;完全满足日常的办公使用&#…

ctf pwn基础-3

学习pwn的第三天&#xff0c;今天是ret2text。 目录 基础 实例讲解 实例讲解2 基础 ret2text就是ROP中最简单的&#xff0c;然后的意思就是我们利用栈溢出&#xff0c;来修改eip的值&#xff0c;让他输出的时候&#xff0c;输出我们想要执行的本身已有的代码&#xff0c;通常…

利用Splunk构建SOC-SOC建设漫谈及splunk的角色

零、免喷符 SOC部门小菜鸟一枚&#xff0c;此乃自闭学安全的笔记记录&#xff0c;行文潦草&#xff0c;随性笔记。 通过上一篇的勒索病毒案例&#xff0c;已经了解到Splunk的强大之处。Splunk那么死贵&#xff0c;他的角色是怎样的&#xff0c;又是怎么和安全及SOC联系起来的…