android自定义View用法

Android 自定义view 的onFinishInflate方法的用法 Android onFinishInflate 加载完成的意思,意思是: 在 setContentView 之后会调用此方法, 或者 比如自己写的 自定义View :MyView mv = (MyView)View.inflate (context,R.layout.my_view,null)之后可以调用此方法 但是在 onFinishInflate 中不能获取 view 宽高,需要在 onMe... 阅读详情

效果图

在这里插入图片描述

布局文件

// An highlighted block
<?xml version="1.0" encoding="utf-8"?>
<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"
    android:orientation="vertical"
    tools:context="bw.com.Unit4.User_DefinedActivity">

    <bw.com.Unit4.CoustomView
        android:id="@+id/my_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

重写view

// An highlighted block
package bw.com.Unit4;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

public class CoustomView extends View {

    Paint paint;

    public CoustomView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        initPaint();

    }
    //初始化 画笔
    private void initPaint() {
        paint = new Paint();

        //设置样式
        /*
        * STROKE: 描边不填充
        * FILL:填充
        * FILL_AND_STROKE: 描边且填充
        * */
        paint.setStyle(Paint.Style.STROKE);
        //设置颜色
        paint.setColor(Color.RED);
        //抗锯齿
        paint.setAntiAlias(true);
        //设置大小   如果设置为0时  默认1px
        paint.setStrokeWidth(5);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //划线
        canvas.drawLine(0,0,100,100,paint);

        //矩形
        RectF rectF1 = new RectF(100,100,200,200);
        canvas.drawRect(rectF1,paint);

        //圆形  属性一:圆心点的x轴 属性二:圆心点的y轴 属性三:半径  属性4:画笔
        canvas.drawCircle(250,250,70,paint);

        //扇形
        RectF rectF2 = new RectF(350,350,400,400);
        canvas.drawArc(rectF2,0,100,true,paint);

        //
        RectF rectF3 = new RectF(100,200,500,500);
        canvas.drawOval(rectF3,paint);

    }
}

Java代码

// An highlighted block
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import bw.com.Unit1.R;

    public class User_DefinedActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user__defined);

        CoustomView view = findViewById(R.id.my_view);
        //开启线程
//        new Thread(view).start();

    }
}

效果图二

在这里插入图片描述

布局文件

// An highlighted block
<?xml version="1.0" encoding="utf-8"?>
<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"
    android:orientation="vertical"
    tools:context="bw.com.Unit4.User_DefinedActivity">

    <bw.com.Unit4.User_View
        android:id="@+id/my_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

重写view

// An highlighted block
package bw.com.Unit4;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;

public class User_View extends View implements Runnable{

    private Context context;
    private Paint paint;

    private int height;
    private int width;

    private int radiu;

    public User_View(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        this.context = context;

        initPaint();

    }
    //初始化画笔和获取屏幕的宽高
    private void initPaint() {


        //获取屏幕管理
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        //获取屏幕度量
        DisplayMetrics displayMetrics = new DisplayMetrics();
        //关联
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        //获取屏幕的宽高
        height = displayMetrics.heightPixels;
        width = displayMetrics.widthPixels;

        //初始化画笔
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(20);
        paint.setColor(Color.BLUE);

    }

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

        canvas.drawCircle(width/2,height/2,radiu,paint);

    }

    @Override
    public void run() {
        while (true){
            //重绘的函数
//            invalidate();
            if (radiu < 500){
                radiu +=20;
            }else{
                radiu = 20;
            }
            //异步线程重绘的函数
            postInvalidate();

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

Java代码

// An highlighted block
package bw.com.Unit4;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import bw.com.Unit1.R;

    public class User_DefinedActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user__defined);

        User_View view = findViewById(R.id.my_view);
        //开启线程
        new Thread(view).start();

    }
}

效果图三

在这里插入图片描述

布局文件

// An highlighted block
<?xml version="1.0" encoding="utf-8"?>
<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"
    android:orientation="vertical"
    tools:context="bw.com.Unit4.User_DefinedActivity">

    <bw.com.Unit4.ElectricFanView
        android:id="@+id/my_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

重写view

// An highlighted block
package bw.com.Unit4;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

public class ElectricFanView extends View implements Runnable{

    private Paint paintR;
    private Paint paintB;
    private Paint paintY;
    private Paint paintG;

    private int height;
    private int width;

    //扇形的起始角度
    private int sweepAngleB;
    private int sweepAngleR;
    private int sweepAngleY;


    public ElectricFanView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        initPaint();

    }
    //初始化画笔
    private void initPaint() {
        //初始化画笔
        paintB = new Paint();
        paintB.setAntiAlias(true);
        paintB.setStyle(Paint.Style.FILL);
        paintB.setStrokeWidth(20);
        paintB.setColor(Color.BLUE);

        paintR = new Paint();
        paintR.setAntiAlias(true);
        paintR.setStyle(Paint.Style.FILL);
        paintR.setStrokeWidth(20);
        paintR.setColor(Color.RED);

        paintY = new Paint();
        paintY.setAntiAlias(true);
        paintY.setStyle(Paint.Style.FILL);
        paintY.setStrokeWidth(20);
        paintY.setColor(Color.YELLOW);

        paintG = new Paint();
        paintG.setAntiAlias(true);
        paintG.setStyle(Paint.Style.FILL);
        paintG.setStrokeWidth(10);
        paintG.setColor(Color.BLACK);

    }
    //初始化圆点
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        this.height = h;
        this.width = w;


    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    }

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

        //画椭圆
        RectF rectFG = new RectF(width/2-50,height/2-125,width/2+50,height/2-75);
        canvas.drawOval(rectFG,paintG);

        //画线
        canvas.drawLine(width/2,height/2,width/2,height/2-100,paintG);

        //设置扇形
        RectF rectFB = new RectF(-(width/4),-(width/4),(width/4),(width/4));
        //                                   sweepAngle扇形扫过的弧度
        canvas.translate(width/2,height/2);
        canvas.drawArc(rectFB,sweepAngleB,30,true,paintB);
        canvas.drawArc(rectFB,sweepAngleR,30,true,paintR);
        canvas.drawArc(rectFB,sweepAngleY,30,true,paintY);



    }

    @Override
    public void run() {
        while (true){
            sweepAngleB+=1;
            sweepAngleR = sweepAngleB+120;
            sweepAngleY = sweepAngleR+120;
            //重绘构造方法
            postInvalidate();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Java代码

// An highlighted block
package bw.com.Unit4;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import bw.com.Unit1.R;

    public class User_DefinedActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user__defined);

        ElectricFanView view = findViewById(R.id.my_view);
        //开启线程
        new Thread(view).start();

    }
}

MTK-Display技术解析:从MDP到DDP的架构演进 本文深入解析了联发科(MTK)显示技术从MDP到DDP的架构演进。MDP作为多媒体数据预处理中心,负责格式转换与缩放;而DDP则整合了OVL、COLOR、AAL等模块,并引入CMDQ与场景化模式,实现了从分散处理到统一智能调度的飞跃,旨在提升画质、流畅度并降低功耗。 阅读详情

相关推荐

FPGA时钟设计陷阱:为什么你的MRCC引脚总触发Place 30-675错误?

本文深入解析FPGA开发中常见的Place 30-675错误,揭示MRCC引脚与时钟资源分配的关键问题。通过对比MRCC与普通IO引脚特性,分析错误根源,并提供时钟约束优化、IP核重配置和手动布局三套解决方案,帮助工程师规避时钟设计陷阱,提升FPGA系统稳定性。

potato的博客 693

正确的在 Android 上使用协程 ViewModelScope、LiveData、LifecycleScope

你还记得是哪一年的 Google IO 正式宣布Kotlin成为 Android 一级开发语言吗?是。如今两年时间过去了,站在一名 Android 开发者的角度来看,Kotlin 的生态环境越来越好了,相关的开源项目和学习资料也日渐丰富,身边愿意去使用或者试用 Kotlin 的朋友也变多了。常年混迹掘金的我也能明显感觉到 Kotlin 标签下的文章慢慢变多了(其实仍然少的可怜)。今年的 Google IO 也放出了的口号,许多新的 API 和功能特性将优先提供 Kotlin 支持。

chuyouyinghe的专栏 3515

手把手教你用Python实现最简单的语义通信(Sem Comm)Demo

本文通过Python和PyTorch,手把手教你构建一个基于深度学习的语义通信(Semantic Communication)Demo。该Demo使用自编码器架构,从MNIST图像中提取低维语义特征进行传输与重建,实现了从“传输比特”到“传递含义”的跨越,并探讨了其效率优势与鲁棒性。

weixin_29080843的博客 247

Android优化

一、布局优化 布局优化就是删除布局中无用的控件和层级,可以用Hierarchy Viewer工具来检测,其次有选择地使用性能较低的ViewGroup。 include标签 include标签只支持以android:layout开头的属性,比如android:layout_width;android:layout_height等,其他属性不支持,比如android:back...

黑夜的触手 681

【报错】sqli-labs靶场搭建出现“Unable to connect to the database: security”

搭建sqli-labs靶场时,“Unable to connect to the database: security”报错解决

九芒星的博客 2991

STM32cubeMX配置FreeRTOS软件定时器

文章目录前言1.软件定时器概述一.软件定时器特性二、使用cubeMX生成软件定时器总结 前言 本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器。 1.软件定时器概述 一.软件定时器特性 软件定时器就是一个闹钟当时间到了就执行相对应的任务或者代码。软件定时器是基于系统滴答中断的。在FreeRTOS中我们可以设置无数个软件定时器。 指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期 (period)。 指定类型定时器有两种类型: 1.一次性 这类定时器启动后,它的回调函

m0_49476241的博客 6949

View->Kotlin协程加载Bitmap给自定义View绘制

Kotlin协程加载Bitmap到指定View区域代码

sunshine_guo的博客 529

TripoSR: Fast 3D Object Reconstruction from a Single Image 论文阅读

模型的主要参数,如变换器的层数、三平面的维度、NeRF模型的具体细节和主要训练配置,在表1中详细说明。TripoSR的算法流程结合了先进的数据处理、模型设计和训练技术,使其能够在不到0.5秒的时间内从单张图像中快速生成详细的3D网格。总体而言,TripoSR是一个强大的3D重建工具,它在速度和质量上都表现出色,但也需要考虑到其对计算资源的需求和在处理极端复杂场景时可能遇到的挑战。:通过精心策划的训练数据集和多样化的数据渲染技术,TripoSR提高了模型的泛化能力和对真实世界图像的适应性。

Christo的博客 1946

【学习】Android中View的工作原理(下)——View的工作流程和自定义View

学习于《Android开发艺术探索》,本文讲解了View的工作流程和自定义View,并给出了一个自定义View的实例

PanicLin的博客 1435

【微服务】SpringBoot 4.0 新特性整合项目实战应用详解

SpringBoot 4.0 新特性整合项目实战应用详解

congge 4588

GVINS数据采集(u-blox fp9 + D435i)

1、配置千寻的RTK账号 采集数据当天购买千寻的RTK账号,然后在Window下,输入账号和密码 (具体的步骤如之前面连接所示),查看u-center软件上的信息,确保接收机可以收到RTK信息; 2、查看Linux系统下u-blox是否可以正常接受GPS信号和RTK数据流 1、GPS信号信息 // 打开端口 1 cd ublox_f9p/src // 或者在终端1下也可以 source devel/setup.bash r.....................

努力努力努力 2609

深入理解Android之自定义View

自定义View、多线程、网络,被认为是Android开发者必须牢固掌握的最基础的三大基本功。而自定义View又是Android开发中特别重要的一环,很多地方都需要用到自定义View。这篇文章我就梳理一下自定义View的相关知识。 目录 (一)什么是自定义View (二)自定义组合View (三)自定义View的绘制 1. Canvas.drawXXX() Pa...

Fighting_初心的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android 自定义View 之 RectF用法详解

/画笔颜色//实心//画笔宽度//光滑/**在纸上画矩形@param canvas 纸*/@Override/**画矩形 以两个点来画,起点和终点,通常是左上为起点,右下为终点 以下面这个图来看参数一:起点的Y轴坐标参数二:起点的X轴坐标参数三:终点的Y轴坐标参数四:终点的Y轴坐标* topbottom *可以看到,左和上无限延长就会在一个点,右和下也是如此,这样应该理解了吧*/运行一下:这个看到就是这样的。然后改一下//空心。

2401_84132393的博客 1084

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android自定义View的用法总结

本文参考了:http://greenrobot.me/devpost/android-custom-layout/ Android SDK中提供了很多UI组件,如RelativeLayout, LinearLayout等,使用自定义控件有两大优点: 1、通过减少View的使用来增加UI的显示效率 2、构建SDK中没有的控件 原文总结了4种自定义View,分别是Compo

bigconvience的专栏 5746

android 自定义view用法

一、统一的用户界面是可以使得应用程序更友好。要做到用户界面的统一,我们就必须用到风格(style)和主题(theme)。 自定义一个View的方法步骤如下: 1、首先,在values文件夹下定义一个atts.xml的文件,描述自定义的控件的属性 在values/attrs.xml中: [xhtml] view plaincopy xml v

OrangeJuiceHei的专栏 798

android自定义View的用法

一、统一的用户界面是可以使得应用程序更友好。要做到用户界面的统一,我们就必须用到风格(style)和主题(theme)。自定义一个View的方法步骤如下:1、首先,在values文件夹下定义一个atts.xml的文件,描述自定义的控件的属性<br />在values/attrs.xml中:<br /> <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TestView">

蓝蓝的天 1万+

Android 自定义View 之 RectF用法详解

在之前通过Circle画了一个奥运五环,这次通过RectF来画矩形,常规的就是长方形正方形之类的。 还是新建一个自定义View,CustomViewRectF,然后继承View,实现里面的两个基本的构造方法,这样就可以在布局中显示了,自定义View代码如下: package com.llw.paintdemo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; im

晨曦 4732

Android自定义View之图形图像工具类Path的特殊用法

概述: 没什么好说的。 Demo 新建一个自定义View public class MyPathView extends View { private int width; private int height; private Paint mPaint; private Path mPath; private Paint mPaintP

zhuhai__yizhi的专栏 574

android自定义view中的OnMeasure的用法

onMeasure在view中的作用:根据父容器传递跟子容器的大小要求来确定子容器的大小。 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)的参数说明和MeasureSpec类的说明: 通过MeasureSpec这个类可以获取父View传递过来的一些信息,包括MODE、SIZE属性。这里做一下说明 MO...

sdlklyg的博客 473

Android 自定义View 中的OnMeasure的用法

作用:根据父容器传递跟子容器的大小要求来确定子容器的大小。protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)的参数说明和MeasureSpec类的说明: 通过MeasureSpec这个类可以获取父View传递过来的一些信息,包括MODE、SIZE属性。这里做一下说明 MODE:分为一

大树 577

Android 自定义View 之 自定义View属性

我们可以自定义View,当然也可以自定义View的属性。下面就从多个方面来介绍自定义View属性的使用。在使用自定义属性之前,我们需要定义属性。一般我们会按下面的步骤来进行:

I'm Learning! 4525

《老罗Android第二季》VideoView、自定义view、实现统计图

1. VideoView播放视频

ymangu的专栏 1712

安卓自定义View进阶-Canvas之绘制图形

安卓自定义View进阶-Canvas之绘制图形在上一篇自定义View分类与流程中我们了解自定义View相关的基本知识,不过,这些东西依旧还是理论,并不能拿来(zhuang)用(B), 这一次我们就了解一些能(zhaung)用(B)的东西。在本篇文章中,我们先了解Canvas的基本用法,最后用一个小示例来结束本次教程。一.Canvas简介Canvas我们可以称之为画布,能够在上面绘制各种东西,是安卓...

houyingshang的博客 229
上一篇: HttpURLConnection网络资源下载断点续传
下一篇: Android百度地图POI检索
EleventP
博客等级 码龄8年 104粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值