自定义控件中的组合控件

自定义控件之组合控件

写Android代码一直都是用的自带控件,有时候一些部分有重复使用,改起来有麻烦。如果把这部分组装起来,形成一个独立的控件,那不是非常爽。于是,就可以使用组合控件。

就比如:一个搜索框里面带有一些按钮,toolbar等等

其实自定义控件分为两种:

  • 一种是这种组合控件,将原有的控件组装为一个常用的控件;

  • 另一种是完全自己画出来的控件,无法使用自带的控件实现

1.把重复使用的布局抽出来

为你的重复使用一组控件,单独写一个xml文件

例如:一个图片和一个文字组成一个组合控件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
      xmlns:android="http://schemas.android.com/apk/res/android"    
      android:layout_width="match_parent"   
      android:layout_height="match_parent"    
      xmlns:app="http://schemas.android.com/apk/res-auto">    

<ImageView        
	android:id="@+id/image"        
	android:layout_width="wrap_content"        
	android:layout_height="wrap_content"           	
	app:layout_constraintTop_toTopOf="parent"        
	app:layout_constraintLeft_toLeftOf="parent"/>    
	
<TextView        
	android:id="@+id/text"        
	android:layout_width="wrap_content"        
	android:layout_height="wrap_content"        
	android:layout_marginTop="2dp"        						
	app:layout_constraintTop_toBottomOf="@+id/image"        	
	app:layout_constraintLeft_toLeftOf="@+id/image"     
	app:layout_constraintRight_toRightOf="@+id/image"/>

</androidx.constraintlayout.widget.ConstraintLayout>

这样就不用在一个布局文件多次重复写一个东西了。不过,也可以使用merge,这样就不会多一层布局了。当前是在一个constrainlayout布局里面,自定义也是一个constraintlayout。在自定义里面,又去插入xml文件的布局,就多了一层。使用merge的话,就少一层。相应,应该会提高效率。

2.把抽出来的布局与自定义view绑起来
  • 先自定义一个view继承自constraintlayout

  • 在构造函数中,绑定布局文件

    public class MyView extends ConstraintLayout {    
    	
          private String text;    
    	private Drawable image;   
    	private TextView textView;  
    	private ImageView imageView;  
    
          public MyView(Context context) {    
    	      this(context, null);  
          }  
    
          public MyView(Context context, AttributeSet attrs) {     
    	      this(context, attrs, -1);  
          }   
    
          public MyView(Context context, AttributeSet attrs, int defStyleAttr) {        		
                super(context, attrs, defStyleAttr);     
    	      //获取布局       
    	      inflate(context, R.layout.my_view, this);     
    	      textView = findViewById(R.id.text);     
    	      imageView = findViewById(R.id.image);     
    
    	      }  
    	
    	public void setText(String text){     
    	      this.text = text;    
    	      textView.setText(text);  
    	}   
    
    	public void setImage(Drawable drawable){    
    		this.image = drawable;       
    		this.imageView.setImageDrawable(drawable);  
    	}
    }
3.设置组合控件的属性

在values文件下,新建一个attrs.xml , 声明自己的属性和属性类型。name为自定义控件的类名,attr的name为属性名,formart为属性类型,(图片这种就是对象引用了)。

<?xml version="1.0" encoding="utf-8"?>
<resources>    
	<declare-styleable name="MyView" >        
		//自定义属性        
		<attr name="myText" format="string"/>        
		<attr name="myImage" format="reference"/>    
	</declare-styleable>
</resources>

然后,在代码中去解析这个自定义的属性。

public MyView(Context context, AttributeSet attrs, int defStyleAttr) {    	
	super(context, attrs, defStyleAttr);    
	//1.获取布局    
	inflate(context, R.layout.my_view, this);   
	textView = findViewById(R.id.text);    
	imageView = findViewById(R.id.image); 
    
	//2.获取属性   
	TypedArray typedArray; 
	typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyView); 
    
    //获取到属性值
	text = typedArray.getString(R.styleable.MyView_myText);    		
	textView.setText(text);   
    //设置属性值
	image = typedArray.getDrawable(R.styleable.MyView_myImage);    		
	imageView.setImageDrawable(image);  
    //记得回收
	typedArray.recycle();
}

自定义属性,其实也是由于你要重复使用,因此一些控件的显示内容要是动态的。要是能像这个textview一样可以在xml中配置,或者使用代码setText(),于是就可以使用自定义属性来配置(纯属个人猜想)。突然想到,如果看了源码,textview的源码,这个textview的属性是不是也都是这么弄。后面再来研究一下。

4.引用自定义组合控件

在main_activity.xml文件中添加如下控件引用:

<com.example.transition.MyView   
	android:layout_width="wrap_content"  
	android:layout_height="wrap_content"  
	app:myImage="@drawable/tol"  
	app:myText="组合控件"/>

然后,运行一下,就可以看到效果了。那么这个图片和text就合成了一个控件。但是应该还有很多细节,需要考虑,让它成为一个真的可以完美使用view。

内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,涵盖正向与逆向运动学求解、正向动力学控制,并采用拉格朗日-欧拉法推导逆向动力学方程,所有内容均通过Matlab代码实现。同时结合RRT路径规划与B样条优化技术,提升机械臂运动轨迹的合理性与平滑性。文中还涉及多种先进算法与仿真技术的应用,如状态估计中的UKF、AUKF、EKF等滤波方法,以及PINN、INN、CNN-LSTM等神经网络模型在工程问题中的建模与求解,展示了Matlab在机器人控制、智能算法与系统仿真中的强大能力。; 适合人群:具备一定Ma六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)tlab编程基础,从事机器人控制、自动化、智能制造、人工智能等相关领域的科研人员及研究生;熟悉运动学、动力学建模或对神经网络在控制系统中应用感兴趣的工程技术人员。; 使用场景及目标:①实现六自由度机械臂的精确运动学与动力学建模;②利用人工神经网络解决传统解析方法难以处理的非线性控制问题;③结合路径规划与轨迹优化提升机械臂作业效率;④掌握基于Matlab的状态估计、数据融合与智能算法仿真方法; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解运动学建模与神经网络控制的设计流程,关注算法实现细节与仿真结果分析,同时参考文中提及的多种优化与估计方法拓展研究思路。
内容概要:本文围绕电力系统状态估计中的异常检测与分类展开,重点介绍基于Matlab代码实现的相关算法与仿真方法。文章详细阐述了在状态估计过程中如何识别和分类量测数据中的异常值,如坏数据、拓扑错误和参数误差等,采用包括残差分析、加权最小二乘法(WLS)、标准化残差检测等多种经典与现代检测手段,并结合实际算例验证方法的有效性。同时,文档提及多种状态估计算法如UKF、AUKF、EUKF等在负荷突变等动态场景下的应用,强调异常处理对提升电力系统运行可靠性与安全性的重要意义。; 适合人群:具备电力系统基础知识和一定Matlab编程能力的高校研究生、科研人员及从事电力系【状态估计】电力系统状态估计中的异常检测与分类(Matlab代码实现)统自动化相关工作的工程技术人员。; 使用场景及目标:①掌握电力系统状态估计中异常数据的产生机制与分类方法;②学习并实现主流异常检测算法,提升对状态估计鲁棒性的理解与仿真能力;③服务于科研项目、课程设计或实际工程中的数据质量分析环节; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,配合电力系统状态估计的基本理论进行深入理解,重点关注异常检测流程的设计逻辑与不同算法的性能对比,宜从简单案例入手逐步过渡到复杂系统仿真。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值