自定义组合控件,自定义View,接口点击事件

Android自定义View初探——自定义组合控件 声明: 本文章例子来源于bilibili 程序猿拉大锯 本文章主要是自己的一些知识点理解,记录自己的学习 自己的感悟: 自己从19年的下半年就开始第一次接触自定义View的内容,期间也断断续续看过一些视频,也自己亲手做过一些小的demo啊等等,最终却都是以失败告终,可能是网上的关于自定义View的内容很乱也没有一个很完整的一套流程,也可能是自己当时比较浮躁,看一些知识点时都是大眼一看,就觉得自己会了,等到真正操作起来却又手忙脚乱,无从下手的感觉。知识嘛,肯定是多多益善,毕竟也是跟我们的薪资有着直接关系的, 阅读详情


先写自定义组合控件的布局LoginView 继承自LinearLayout

public class LoginViewextends LinearLayoutimplements View.OnClickListener{


    private Context _context;
    public LoginView(Context context) {
        super(context);
    }

    public LoginView(Context context, AttributeSet attrs) {
        super(context, attrs);
        _context = context;

        //将指定布局id填充到当前页面
        View view = LayoutInflater.from(context).inflate(R.layout.view_login, this, true);

        Button right_btn = view.findViewById(R.id.right_btn);

        right_btn.setOnClickListener(this);
    }

    public LoginView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void onClick(View view) {
        /*if(view.getId()==R.id.right_btn){
            Toast.makeText(_context,"right",Toast.LENGTH_SHORT).show();
        }*/
        //调用接口的方法
        loginViewClickListener.loginViewButtonClicked(view);
    }

    //定义接口的成员
    OnLoginViewClickListener loginViewClickListener;
    //接口的setter
    public void setOnLoginViewClickListenler(OnLoginViewClickListener loginViewClickListener){
         //在setter中把这个接口的实现赋值给这个loginview的上面定义的接口
          this.loginViewClickListener = loginViewClickListener;
    }


    //接口
    public interface OnLoginViewClickListener{
        public void loginViewButtonClicked(View v);//传的参数
    }
}

写自定义组合控件LoginView 的对应的布局view_login

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#D4DBED"
        android:orientation="horizontal">

        <Button

            android:textSize="23sp"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:background="#D4DBED"
            android:text="<" />

        <TextView
            android:textSize="23sp"
            android:gravity="center"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#D4DBED"
            android:text="那些花儿" />

        <Button
            android:id="@+id/right_btn"
            android:textSize="23sp"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:background="#D4DBED"
            android:text="⑤" />
    </LinearLayout>
</LinearLayout>
activity_main里面的,将自定义组合控件引入进来

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

  <com.example.a171104zhouliu_moniti.LoginView
      android:id="@+id/loginView"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1"/>

<LinearLayout
    android:gravity="center"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="6"
   >

  <com.example.a171104zhouliu_moniti.CustomProgressView
      android:id="@+id/custom_ProgressView"
      android:layout_width="200dp"
      android:layout_height="200dp"
     />

  <Button
      android:id="@+id/saomiao"
      android:text="扫描二维码"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      />

</LinearLayout>
</LinearLayout>

MainActivity里面的代码,拿到自定义控件的id,,new出接口,点击按钮执行进度条
public class MainActivity extends AppCompatActivity {

    private LoginView loginView;
    private Button btnsaomiao;
    private CustomProgressView customProgressView;

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

        //拿到滚动条的视图
        customProgressView = (CustomProgressView) findViewById(R.id.custom_ProgressView);
        btnsaomiao = (Button) findViewById(R.id.saomiao);
        loginView = (LoginView) findViewById(R.id.loginView);
        //在这个实现上把接口new出来
        loginView.setOnLoginViewClickListenler(new LoginView.OnLoginViewClickListener() {
            @Override
            public void loginViewButtonClicked(View v) {
                 //判断当前点击的v是哪个
                if(v.getId()==R.id.right_btn){
                   // Toast.makeText(MainActivity.this, "Login", Toast.LENGTH_LONG).show();
                    //点击右边的按钮 跳转到 secondActivity
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                }
            }
        });


        //扫描按钮的点击事件
        btnsaomiao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
             //点击按钮 调用滚动条的方法
             customProgressView.start();
            }
        });
    }
}


自定义圆和进度条CustomProgressView的代码
public class CustomProgressView extends View{
    //定义画笔
    private Paint paint;
    //进度的值
    private int progress = 0;//一开始是0
    //控制循环的变量
    private boolean running = true;
 Context context;
    public CustomProgressView(Context context) {
        super(context);
    }

    public CustomProgressView(Context context, AttributeSet attrs) {
        super(context, attrs);
      this.context = context;
        //创建画笔
        paint = new Paint();
        paint.setAntiAlias(true);//抗锯齿
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);//填充是空心的

 }

    //抽成一个方法,,
    public void start(){

        new Thread(new Runnable() {
            @Override
            public void run() {
                //循环
                while(running){

                    if(progress>=360){
                        //如果进度已经大于了360,就跳出
                        running = false;

                        Intent intent = new Intent(context, CaptureActivity.class);
                        context.startActivity(intent);
                        return;
                    }

                    progress+=10;//进度每次加10

                    //子线程刷新,
                    postInvalidate();

                    try {
                        //睡眠
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
    public CustomProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

        //获取当前view 的宽度,x,y确定了圆心的位置
        int x = getWidth()/2;
        int y = getHeight()/2;

        int radius = 100;//圆的半径


        //利用这个rectf来确定弧形的范围
        RectF rectF = new RectF(x-radius,y-radius,x+radius,y+radius);
        paint.setColor(Color.GRAY);
        paint.setStrokeWidth(20);
        canvas.drawCircle(x,y,radius,paint);
        //user center 为false不从中心点开始
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(20);
       canvas.drawArc(rectF,-90,progress,false,paint);

        //计算百分比的值,,整体强转成int
        int zhi = (int) ((float) progress/360*100);
        //计算百分比的值的位置
        float zhiWidth = paint.measureText(zhi+"%");

        //根据这个矩形 求 百分比值的 高度
        Rect rectZhi = new Rect();
        paint.getTextBounds(zhi+"%",0,(zhi+"%").length(),rectZhi);
        //字符串的高度:rectZhi.height()
        paint.setTextSize(15);
        paint.setStrokeWidth(1);

        //画文字
      canvas.drawText(zhi+"%",x-zhiWidth/2,x+zhiWidth/2,paint);

    }
}
点击组合控件上的按钮,跳转到secondAcitivity里面,,布局里面引入自定义阶梯矩阵的
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
  android:orientation="vertical"
   >

    <com.example.a171104zhouliu_moniti.LoginView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
       ></com.example.a171104zhouliu_moniti.LoginView>

    <com.example.a171104zhouliu_moniti.CustomJieTiRect
        android:layout_width="match_parent"
        android:layout_weight="5"
        android:layout_height="0dp" />

</LinearLayout>

自定义阶梯矩阵的代码
public class CustomJieTiRect extends View{
    public CustomJieTiRect(Context context) {
        super(context);
    }

    public CustomJieTiRect(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomJieTiRect(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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


        Paint paint1 = new Paint();
        paint1.setTextSize(10);
        paint1.setColor(Color.BLACK);
         Rect rect = new Rect(0,0,250,80);
        canvas.drawRect(rect,paint1);

        Paint paint2 = new Paint();
        paint2.setTextSize(10);
        paint2.setColor(Color.RED);
        Rect rect1 = new Rect(250,80,500,160);
        canvas.drawRect(rect1,paint2);

        Paint paint3 = new Paint();
        paint3.setTextSize(10);
        paint3.setColor(Color.BLUE);
        Rect rect2 = new Rect(500,160,1000,250);
        canvas.drawRect(rect2,paint3);
      /*  canvas.drawRect(0,0,150,80,paint1);
        canvas.drawRect(150,80,300,160,paint2);
        canvas.drawRect(300,160,500,250,paint3);*/

             /*Paint paint = new Paint();
               paint.setColor(Color.BLUE);
               paint.setAntiAlias(true);
               canvas.drawRect(0,0,getWidth()/3,70,paint);
              paint.setColor(Color.GRAY);
             canvas.drawRect(getWidth()/3,70,getWidth()/2+70,140,paint);
              paint.setColor(Color.RED);
                canvas.drawRect(getWidth()/2+70,140,getWidth(),210,paint);*/


 }}
Android自定义View——再探自定义组合控件 这里写目录标题声明1.继承自父容器2.定义获取相关属性->res/values/attrs3.把子view加载进来4.定义功能接口 interface5.暴露点击事件供外部实现 声明 本文章例子来源于bilibili up 程序猿拉大锯 本文章主要是自己对于一些知识点理解算是总结吧,记录自己的学习 本专栏不会进行收费,所有文章都会设置成试读,请各位读者放心,设置收费专栏是为了让更多的人看到此专栏 ok ,根据上篇文章你肯定对自定义组合控件算是有了一定的理解了,为了加深记忆,这里再上一个有关自定义组合控 阅读详情

相关推荐

用Docker-Compose三节点部署生产级Doris集群:从配置文件到故障转移

本文详细介绍了如何使用Docker-Compose部署一个生产级的三节点Apache Doris集群。内容涵盖从核心架构理解、配置文件编写到集群初始化验证的全过程,并重点讲解了如何实现高可用、数据持久化、健康检查以及故障转移等生产级运维关键点,为中小团队提供了一种在容器化便利性与系统稳定性间取得平衡的可靠部署方案。

kkk56的博客 856

View点击事件:三种方式实现OnClickListener接口

View点击事件:三种方式实现OnClickListener接口1.创建内部类  创建一个内部类实现OnClickListener接口并重写onClick方法:protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout...

MarkShz的博客 9903

足球赛事数据API:开发者生存指南(附真实踩坑记录)

作为一个既爱看球又爱写代码的老宅男,我这些年用过的足球API比看过的比赛还多。从最初被各种API文档折磨到怀疑人生,到现在能闭着眼睛调接口,中间的血泪史够写本书了。今天就把这些经验(和教训)分享给各位同好,特别是那些正在为"老板要做个足球App"而秃头的同行们。文档清晰免费层可用响应格式规范API-Sports免费额度大方支持GraphQL有中文文档(难得!Sportmonks数据全面有Webhook支持按需付费。

Happy0970的博客 2192

android 自定义View implements OnClickListener

应该是你代码写的有问题。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

tasty 2493

从收音机到Arduino:手把手教你用BJT三极管搭建一个简易音频放大器(附电路图与元件清单)

本文详细介绍了如何使用BJT三极管搭建简易音频放大器,涵盖电路原理、元件选择、设计步骤及调试技巧。通过实践项目帮助电子爱好者深入理解BJT的放大特性,并提供与Arduino结合的扩展应用方案,适合创客和DIY玩家。

aitie1479的博客 441

STM32(H7)学习记录-14 XSPI连接DDR SDRAM(HyperBus)

主控芯片是STM32H7S7 ,HyperBusRAM芯片是W956D8MBYA5I。*DQS0(这个引脚是作为RWDS)使用的CubeMX版本是6.13.0。

m0_71918616的博客 1073

自定义view点击事件

,我们可以通过Button点击事件来类比学习下,首先看Button的点击事件是如何使用的: button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } });  ...

runrun117的博客 1090

ROS2 多机器人导航仿真入门教程(一)

RMF 是建立在 ROS 2 基础上的一系列可重复使用、可扩展的库和工具,可实现任何类型机器人系统的异构机群的互操作性。RMF 利用标准化的通信协议与部署机器人的基础设施、环境和自动化系统进行通信,以优化关键资源(如机器人、电梯、门、通道等)的使用。它通过资源分配和通过 RMF 核心(将在本书后面详细介绍)防止共享资源冲突,从而为系统增加智能。RMF 灵活而强大,几乎可以在任何通信层上运行,并与任何数量的物联网设备集成。RMF 的架构设计允许随着环境自动化水平的提高而扩展。

2506_90492529的博客 1659

app简单控件了解——按钮——第二种按钮点击方式——采用匿名内部类

如何为按钮添加监听方式总结 本文概述: 本文介绍了,在Android中为控件添加监听的三种常见方式 设置控件的onClick属性 采用匿名内部类 MainActivity 实现 View.OnClickListener 接口 ======================================================================== &...

小白龙白龙马的博客 318

【机器学习|评价指标8】混淆矩阵(Confusion Matrix)、Cohen‘s Kappa 系数、详解,平均交并比(mIoU)、列联表(Contingency Table)附代码。

【机器学习|评价指标8】混淆矩阵(Confusion Matrix)、Cohen's Kappa 系数、详解,平均交并比(mIoU)、列联表(Contingency Table)附代码。

2401_89898861的博客 1430

Python 爬虫实战:抓取应届生求职网校招岗位信息,助力学子就业

应届生求职网作为国内知名的招聘平台,汇聚了大量企业的校招岗位信息。了解这些岗位信息,对于应届毕业生制定求职策略、企业制定招聘计划以及相关就业市场分析等都具有重要意义。因此,本文将深入探讨如何运用 Python 爬虫技术从应届生求职网平台抓取校招岗位信息,为应届毕业生提供有益的就业信息支持。本文深入探究了利用 Python 爬虫技术从应届生求职网平台抓取校招岗位信息的全流程。从前期的环境搭建、模拟登录,到核心的数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。

u014481728的博客 1301

android 自定义onclicklistener,android – 如何在自定义操作栏上获取onClickListener()事件...

我正在开发一个应用程序,我必须通过点击actionbar自定义视图获取onClick()事件.到目前为止,我可以实现以下布局.这是我的代码实现这个:@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activi...

weixin_30951515的博客 311

科技与伦理的平衡点:人类计算的伦理

科技与伦理的平衡点:人类计算的伦理 关键词 科技与伦理 人类计算 隐私问题 道德决策自动化 公平性与偏见 法律与社会责任 摘要 本

AI天才研究院 1163

Android Studio自定义组合控件

在Android的开发中,为了能够服用代码,会把有一定共有特点的控件组合在一起定义成一个自定义组合控件。 本文就详细讲述这一过程。虽然这样的View的组合有一个粒度的问题。粒度太大了无法复用,粒度太小了又 达不到很好的复用的效果。不过,这些不在本文的讨论范围,需要读者自己去开发的实践中体会。 实例项目就选择一个登录注册的组件,这组件包括用户名、密...

weixin_33860147的博客 113

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android自定义View入门级

Android入门级的自定义View(自绘,组合,继承)

Millet 494

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android自定义view(二),组合控件Titlebar的定制

前言:我相信”天生我才必有用”这句话,每个人都有他的作用,也许他的作用相对其他人来不是很明显,也许他的作用也就是取悦别人,但是请不要忘记,可以通过不断努力来发挥自己的作用,使自己的价值得到提升。在平时的android开发中你是否遇到一个问题,那就是每次都要自己写一个布局,或者是引入一个布局但每次都要为了给布局中的控件初始化。对于这个问题,谷歌官方推出了ActionBar,以及随后的取代ActionB

宿罪的博客 6330

假人有限元模型

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

自定义View组合控件搜索框搜索内容

自定义组合控件Button按钮点击事件 private void ininData(final Context context) { LayoutInflater.from(context).inflate(R.layout.search_layout, this); seek = findViewById(R.id.search_seek); ...

表叔很ok的博客 389

自定义组合控件+点击事件

******************************************* Activity package www.bawei.com.newobj; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.support.annota

贼的博客 866

Android --- 自定义View的三种实现方式及自定义属性使用介绍

我们在使用Android原生控件的时候,经常可以看到在布局文件中可以设置很多的属性值,如

梁同学与Android 2672

android view设置按钮颜色_Android 自定义View篇(四)自定义属性详解

作者:宋者为王连接:https://cnblogs.com/andy-songwei/p/10979161.html前言尽管 Android 系统提供了不少控件,但是有很多酷炫效果仍然是系统原生控件无法实现的。好在 Android 允许自定义控件,来弥补原生控件的不足。但是在很多初学者看来,自定义 View 似乎很难掌握。其中有很大一部分原因是我们平时看到的自定义 View 使用中,有多...

weixin_39616686的博客 538

Android自定义view——组合控件

前言当我们需要使用标题栏时,很显然标题栏都是一样的,这个时候我们就很可能使用组合控件,既然是组合控件我们当然是把几个已有的控件组合到一起。这里我们打算实现如下效果: 组合两个button和一个TextView来模拟标题栏对ActionBar的处理我们自定义了标题栏我们便可以将原有的actionBar给隐藏,此时在MainActivity里:// 隐藏Actionbar

清风洒脱 2921

自定义组合控件的步骤

学习自定义组合控件笔记

weixin_45257021的博客 3197

android 自定义组合控件并实现点击事件

第一步:写出需要组合的布局:例如(登录)下图: 第二步:自定义属性,在value下新建一个 attts.xml 文件,写入如下代码: &lt;!--自定义属性--&gt; &lt;declare-styleable name="customView"&gt; &lt;attr name="tv1" format="string" /&gt; ..

ljp345775的博客 6951

[自定义view]Android实战技巧之组合控件

组合控件是自定义控件的一种,只不过它是由其他几个原生控件组合而成,故名组合控件。 在实际项目中,GUI会遇到一些可以提取出来做成自定义控件情况。 一个自定义控件的好处就是把一些需要模块化的UI和逻辑放在一起,做到了高内聚,向其他模块提供接口并很少  依赖外界,这样就是低耦合。一个自定义控件就是一个封闭的王国,这里由你掌控。 上述是我自己的一个体会,想必大家也会常做自定义控件吧,

ysyh55的专栏 720

自定义view组合控件笔记

组合控件 1.自定义需要的属性--在valus下新建 //这是自定义的属性 //第一个属性 //背景不仅可以是十六进制颜色 和图片等资源文件, 2-- TypedArray ta = context.obtainStyleAttributes(attrs,R.styleable.name) 获取自定义的属性,ta.getString(),ta.getDr

sampsonjun的博客 498

android 原理 组合控件_Android组合控件实现功能强大的自定义控件

通常情况下,Android实现自定义控件无非三种方式。Ⅰ、继承现有控件,对其控件的功能进行拓展。Ⅱ、将现有控件进行组合,实现功能更加强大控件。Ⅲ、重写View实现全新的控件上文说过了如何继承现有控件来自定义控件:《Android继承现有控件拓展实现自定义控件textView》,这节我们来讨论第二个议题。怎么将控件组合来实现一个功能强大的自定义控件。先看看创建组合控件的好处吧,创建组合控件能够很好的...

weixin_39807691的博客 197
上一篇: 自定义View,按照百分比画圆
下一篇: 二维码的应用,扫描二维码和生成二维码,使用回传值,导入依赖
Developer_Sir
博客等级 码龄9年 3粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值