精华内容
下载资源
问答
  • 属于动作按钮中的按钮形式
    万次阅读 多人点赞
    2018-04-03 17:05:06

          以下的示例程序是要在一个面板中添加三个按钮,并分别添加三个监听器对象用来作为按钮的动作监听器,当点击不同的按钮时使得面板的背景色变成相应的颜色:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ButtonFrame{
    	public static void main(String[] args){
    	    EventQueue.invokeLater(() -> {
        	        JFrame frame= new CreatButtonFrame();
                    frame.setTitle("ButtonTest");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);});	
    	}
    }
    
    class CreatButtonFrame extends JFrame{
    	private JPanel buttonPanel;
    	private static final int DEFAULT_WIDTH = 300;
    	private static final int DEFAULT_HEIGHT = 200;
    	public CreatButtonFrame(){
    		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    	    JButton yellowButton = new JButton("Yellow");
    	    JButton blueButton = new JButton("Blue");
    	    JButton redButton = new JButton("Red");
    	    buttonPanel = new JPanel();
    	    buttonPanel.add(yellowButton);
    	    buttonPanel.add(blueButton);
    	    buttonPanel.add(redButton);
    	    add(buttonPanel);
    	    ColorAction yellowAction = new ColorAction(Color.YELLOW);
    	    ColorAction blueAction = new ColorAction(Color.BLUE);
    	    ColorAction redAction = new ColorAction(Color.RED);
    	    yellowButton.addActionListener(yellowAction);
    	    blueButton.addActionListener(blueAction);
    	    redButton.addActionListener(redAction);
    	}
    	
    	class ColorAction implements ActionListener{
    		private Color backgroundColor;
    		public ColorAction(Color c){
    			backgroundColor = c;
    		}
    		public void actionPerformed(ActionEvent event){
    			buttonPanel.setBackground(backgroundColor);
    		}
    	}
    }

          以上程序没必要单独为事件监听器定义一个类并构造类的3个对象,因此,可以使用lambda表达式简化如下:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ButtonFrame{
    	public static void main(String[] args){
    		EventQueue.invokeLater(() -> {
        	JFrame frame= new CreatButtonFrame();
            frame.setTitle("ButtonTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);});	
    	}
    }
    
    class CreatButtonFrame extends JFrame{
    	private JPanel buttonPanel;
    	private static final int DEFAULT_WIDTH = 300;
    	private static final int DEFAULT_HEIGHT = 200;
    	public CreatButtonFrame(){
    		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    		buttonPanel = new JPanel();
    		makeButton("yellow",Color.yellow);
    		makeButton("blue",Color.blue);
    		makeButton("red",Color.red);
    		add(buttonPanel);
    	}
    	public void makeButton(String name, Color backgroundColor) {
    	    JButton button = new JButton(name);
    	    buttonPanel.add(button);
    	    button.addActionListener(event ->
    	    	buttonPanel.setBackground(backgroundColor));
    	}
    }

          此外,当我们不习惯于使用lambda表达式,而是更喜欢创建实现了ActionListener接口的事件源容器,然后这个容器再设置自身作为监听器,则可以修改为如下的形式:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ButtonFrame{
    	public static void main(String[] args){
    		EventQueue.invokeLater(() -> {
        	JFrame frame= new CreatButtonFrame();
            frame.setTitle("ButtonTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);});	
    	}
    }
    
    class CreatButtonFrame extends JFrame implements ActionListener{
    	private JPanel buttonPanel;
    	private static final int DEFAULT_WIDTH = 300;
    	private static final int DEFAULT_HEIGHT = 200;
    	private Button yellowButton,blueButton,redButton;
    	public CreatButtonFrame(){
    		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    		buttonPanel = new JPanel();
    		yellowButton=new Button("yellow");
    		blueButton=new Button("blue");
    		redButton=new Button("red");
    		yellowButton.addActionListener(this);
    		blueButton.addActionListener(this);
    		redButton.addActionListener(this);
    		buttonPanel.add(yellowButton);
    		buttonPanel.add(blueButton);
    		buttonPanel.add(redButton);
    		add(buttonPanel);
    	}
    	public void actionPerformed(ActionEvent event) {
    		Object source=event.getSource();
    		if(source==yellowButton) {
    			buttonPanel.setBackground(Color.yellow);
    		}else if(source==blueButton) {
    			buttonPanel.setBackground(Color.blue);
    		}else if(source==redButton){
    			buttonPanel.setBackground(Color.red);
    		}
    	}
    }

          此外,还可以采用一种机制指定事件监听器,其事件处理器包含一个方法调用。例如当一个按钮监听器需要执行调用:

      frame.doMethod();

    可以通过EventHandler类创建一个监听器:

      EventHandler.create(ActionListener.class,frame,"doMethod")

    但利用lambda表达式更容易实现:

      event -> frame.doMethod();

    因此,这种通过EventHandler类创建监听器的方法不常用。该方法的完整示例如下,该示例在点击按钮“Click Here”后会打印“Hello World!”的消息:

    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import java.beans.*; 
    public class Buttonhand extends JFrame{
    	public static void main(String args[]){
    		JFrame frame = new Buttonhand(); 
    		frame.setSize(300, 400); 
    		frame.setVisible(true); 	
    	}
    	public Buttonhand(){
    		super("事件处理"); 
    		setDefaultCloseOperation(EXIT_ON_CLOSE); 
    		JButton button = new JButton("Click Here"); 
    		Container contentPane = getContentPane(); 
    		contentPane.add(button, BorderLayout.CENTER); 
    		button.addActionListener( (ActionListener)EventHandler.create( ActionListener.class, this, "print") ); 
    	}
    	public void print(){
    		System.out.println("Hello World!");	
    	} 
    }
    更多相关内容
  • 方法来触发按钮动作,而改成用一个block的方式来出发动作,这样处理后,一可以降低代码的分散度,二当我再次查看按钮的触发方法实现细节时就不用点command跳到方法里,而是在按钮的初始化位置就能看到按钮的点击...
  • 在odoo13,给 增加按钮项,需要使用如下形式: id="action_multi_modification_address" res_model="fcwz.multi.modification_address" binding_model="fcwz.manufacture_product" binding_views="list" view_...

    其实这一篇文章讲的主要是 odoo 瞬态模型的使用 。 

    <!--批量修改收货地址-->
    <record id="view_multi_modification_address" model="ir.ui.view">
        <field name="name">批量修改发货地址</field>
        <field name="model">fcwz.multi.modification_address</field>
        <field name="arch" type="xml">
            <form string="批量修改发货地址">
                <div style="color:#31708f">
                    如勾选‘代寄’且原产品为非代寄产品,请自行创建<strong>代寄费订单</strong>给客户扣款!
                </div>
                <group col="4">
                    <field name="deliver_people" required="1"/>
                    <field name="deliver_phone" required="1"/>
                    <field name="deliver_province" required="1"/>
                    <field name="deliver_city" required="1"/>
                    <field name="deliver_county" required="1"/>
                    <field name="deliver_address" required="1"/>
                    <field name="is_ship"/>
                </group>
                <footer>
                    <button name="confirm_multi_modification_address" string="确认" type="object"
                            class="btn-primary"/>
                    <button string="取消" class="btn-default" special="cancel"/>
                </footer>
            </form>
        </field>
    </record>
    
    <act_window
        name="批量修改发货地址"
        id="action_multi_modification_address"
        res_model="fcwz.multi.modification_address"
        binding_model="fcwz.manufacture_product"
        binding_views="list"
        view_mode="form"
        target="new"
        context="{'default_ids': [active_id]}"
    />

     在odoo13中,给  增加按钮项,需要使用如下形式:

    <act_window
        name="批量修改发货地址"                          <!-- 按钮项显示文字 -->
        id="action_multi_modification_address"        <!-- 唯一id -->            
        res_model="fcwz.multi.modification_address"   <!-- 目标模型,也是要打开的视图所使用的模型 --> 
        binding_model="fcwz.manufacture_product"      <!-- 将这个按钮绑定在哪个模型上 --> 
        binding_views="list"                          <!-- 将这个按钮绑定在什么视图上 --> 
        view_mode="form"                              <!-- 目标视图的类型 --> 
        target="new"                                  <!-- 打开方式 --> 
        context="{'default_ids': [active_id]}"        <!-- 传参数,在后台获取 --> 
    />

    后台处理

        # 确认
        def confirm_multi_modification_address(self):
            _logger.info('=========批量修改产品收货地址的产品ID===========')
            # 获取选中的ID self._context.get('active_ids', [])
            _logger.info(self._context.get('active_ids', []))
            # 进行操作
            manufacture_products = self.env['fcwz.manufacture_product'].browse(self._context.get('active_ids', []))
            write_dict = {
                'deliver_people': self.deliver_people,
                'deliver_phone': self.deliver_phone,
                'deliver_province': self.deliver_province,
                'deliver_city': self.deliver_city,
                'deliver_county': self.deliver_county,
                'deliver_address': self.deliver_address
            }
            for manufacture_product in manufacture_products:
                if manufacture_product.is_ship != self.is_ship:
                    write_dict['is_ship'] = self.is_ship
                manufacture_product.write(write_dict)
            # 执行完操作 关闭窗口
            return {'type': 'ir.actions.act_window_close'}

    上述可在源码中查找到  .rst文件中有些许蛛丝马迹


    2020-02-19 补充,如何在form表单中增按钮,在点击按钮时,调用这个操作框(实际上就不是批量操作了,但也有这种需求):

    <header>
        <button name="%(action所在模块名.action_multi_modification_address)d" string="修改地址" type="action" />
    </header>

     

    展开全文
  • submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了,submit和button,二者都以按钮形式展现,看起来都是按钮,所不同的是type属性和处发响应的事件上。 在javaScript关于submit和button的...
  • 常见的按钮类包括:QPushButton、QRadioButton和QCheckBox等。这些按钮类均继承自QAbstractButton类,根据各自的使用场景通过图形展现出来。

    目录

     

    1、QPushButton按钮类

    2、QRadioButton按钮类

    3、QCheckBox按钮类


    在GUI设计中,按钮都是最重要的和常用的触发动作请求的方式,用来与用户进行交互操作。在PyQt中根据不同的使用场景将按钮划分为不同的表现形式。

    按钮的基类是QAbstractButton,提供了按钮的通用性功能。但是它不能实例化,必须由其他的按钮类继承QAbstractButton类,来实现不同的功能、不同的表现形式。

    常见的按钮类包括:QPushButton、QRadioButton和QCheckBox等。这些按钮类均继承自QAbstractButton类,根据各自的使用场景通过图形展现出来。

    QAbstractButton提供的状态如下表所示:

    QAbstractButton提供的信号如下表所示: 

    1、QPushButton按钮类

    QPushButton类继承自QAbstractButton类,其形状是长方形,文本标题或图标可以显示在长方形上。

    QPushButton类是一种命令按钮,可以单击该按钮执行一些命令,或者响应一些事件,常见的有:“确认"、"申请"、"取消"、"关闭"、"是"、"否"等按钮。

    QPushButton类中的常用方法如下表所示:

    来看看QPushButton按钮类的示例,效果如下所示:

    在这个例子中,创建了btn1、btn2、btn3和btn4四个按钮,这四个QPushButton对象被定义为类的实例变量。每个按钮都将clicked信号发送给指定的槽函数,以响应按钮点击事件。

    • 第1个按钮btn1,通过toggle()函数来切换按钮状态。当点击这个按钮时,将clicked信号发送给槽函数btnstate(),通过btn.isChecked来获得按钮是否被点击或释放的状态。还可以通过lambda的方式来传递额外的参数btn1,将clicked信号发送给槽函数whichbtn()。
    • 第2个按钮btn2,上面显示一个图标。使用setlcon()方法接收一个QPixmap对象的图像文件作为输入参数。
    • 第3个按钮btn3,使用setEnabled()方法来禁用bnt3按钮。
    • 第4个按钮btn4,使用setDefault()方法来设置按钮的默认状态。快捷键是“&+文本”(&Download),通过“Alt+D”快捷键来调用槽函数。

    实现代码如下所示:

    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    class Form(QDialog):
    	def __init__(self, parent=None):
    		super(Form, self).__init__(parent)
    		layout = QVBoxLayout()
    
    		self.btn1 = QPushButton("Button1")
    		self.btn1.setCheckable(True)
    		self.btn1.toggle()
    		self.btn1.clicked.connect(lambda:self.whichbtn(self.btn1) )
    		self.btn1.clicked.connect(self.btnstate)
    		layout.addWidget(self.btn1)
                
    		self.btn2 = QPushButton('image')
    		self.btn2.setIcon(QIcon(QPixmap("./python.png")))
    		self.btn2.clicked.connect(lambda:self.whichbtn(self.btn2) )
    		layout.addWidget(self.btn2)
    		self.setLayout(layout) 
    
    		self.btn3 = QPushButton("Disabled")
    		self.btn3.setEnabled(False)
    		layout.addWidget(self.btn3)
            
    		self.btn4= QPushButton("&Download")
    		self.btn4.setDefault(True)
    		self.btn4.clicked.connect(lambda:self.whichbtn(self.btn4))
    		layout.addWidget(self.btn4)
    		self.setWindowTitle("Button demo")
    
    	def btnstate(self):
    		if self.btn1.isChecked():
    			print("button pressed" ) 
    		else:
    			print("button released" ) 
    
    	def whichbtn(self,btn):
    		print("clicked button is " + btn.text() ) 
    
    if __name__ == '__main__':
    	app = QApplication(sys.argv)
    	btnDemo = Form()
    	btnDemo.show()
    	sys.exit(app.exec_())

    2、QRadioButton按钮类

    QRadioButton类提供了一组可供选择的按钮和文本标签,用户可以选择其中一个选项,标签用于显示对应的文本信息。单选钮是一种开关按钮,可以切换为on或者off,即checked或者unchecked,主要是为用户提供"多选一"的选择。

    QRadioButton是单选钮控件默认是独占的(Exclusive)。对于继承自同一个父类Widget的多个单选钮,它们属于同一个按钮组合,在单选钮组里,一次只能选择一个单选钮。如果需要多个独占的按钮组合,则需要将它们放在QGroupBox或QButtonGroup中。

    QRadioButton类中的常用方法如下表所示:

    在QRadioButton中,toggled信号是在切换单选钮状态(开、关)时发射的,而clicked信号则在每次点击单选钮时都会发射。在实际中,一般只有状态改变时才有必要去响应,因此toggled信号更适合用于状态监控。

    来看看QRadioButton按钮类的示例,效果如下所示:

    在这个例子中,两个互斥的单选钮被放置在窗口中。

    第1个单选钮btn1,被设置成默认选中状态。

    self.btn1.setChecked(True)

    当选择两个按钮相互切换时,按钮的状态发生改变,将触发toggle信号,并与槽函数btnstate()连接。使用lambda的方式允许将源信号传递给槽函数,将按钮作为参数。

    self.btn1.toggled.connect(lambda:self.btnstate(self.btn1))
    self.btn2.toggled.connect(lambda:self.btnstate(self.btn2))

    当发射toggled信号后,使用btnstate()函数来检查按钮的状态。

    实现代码如下所示:

    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    class Radiodemo(QWidget):
    	def __init__(self, parent=None):
    		super(Radiodemo, self).__init__(parent)
    		layout = QHBoxLayout()
    		self.btn1 = QRadioButton("Button1")
    		self.btn1.setChecked(True)
    		self.btn1.toggled.connect(lambda:self.btnstate(self.btn1))
    		layout.addWidget(self.btn1)
            
    		self.btn2 = QRadioButton("Button2")
    		self.btn2.toggled.connect(lambda:self.btnstate(self.btn2))
    		layout.addWidget(self.btn2)
    		self.setLayout(layout)
    		self.setWindowTitle("RadioButton demo")
    	
    	def btnstate(self,btn):
    		if btn.text()=="Button1":
    			if btn.isChecked() == True:
    				print( btn.text() + " is selected" )
    			else:
    				print( btn.text() + " is deselected" )
    		
    		if btn.text()=="Button2":
    			if btn.isChecked()== True :
    				print( btn.text() + " is selected" )
    			else:
    				print( btn.text() + " is deselected" )
    
    if __name__ == '__main__':
    	app = QApplication(sys.argv)
    	radioDemo = Radiodemo()
    	radioDemo.show()
    	sys.exit(app.exec_())

    3、QCheckBox按钮类

    QCheckBox类提供了一组带文本标签的复选框,用户可以选择多个选项。和QPushButton一样,复选框可以显示文本或者图标,其中文本可以通过构造函数或者setText()来设置;图标可以通过setlcon()来设置。在视觉上,QButtonGroup可以把许多复选框组织在一起。

    QCheckBox(复选框)和QRadioButton(单选钮)都是选项按钮,因为它们都可以在开(选中)或者关(未选中)之间切换。它们的区别是对用户选择的限制:单选钮提供了“多选一"的选择;而复选框提供的是“多选多"的选择。

    QCheckBox通常被应用在需要用户选择一个或多个可用的选项的场景中。

    只要复选框被选中或者取消选中,都会发射一个stateChanged 信号。如果想在复选框状态改变时触发相应的行为,请连接这个信号,可以使用isChecked()来查询复选框是否被选中。

    除了常用的选中和未选中两种状态,QCheckBox还提供了第三种状态(半选中)来表明“没有变化"。当需要为用户提供一个选中或者未选中复选框的选择时,这种状态是很有用的。如果需要第三种状态,则可以通过setTristate()来使它生效,并使用checkState()来查询当前的切换状态。

    QCheckBox类中的常用方法如下表所示:

    三态复选框有三种状态,如下表所示:

    来看看QCheckBox按钮类的示例,效果如下所示:

    在这个例子中,将三个复选框添加到一个水平布局管理器中,并添加到一个QGroupBox组中。

    将三个复选框的stateChanged信号都连接到槽函数stateChanged()。使用lambda的方式传递对象给槽函数。当QCheckBox状态改变时发射stateChanged信号,当信号发生改变时触发自定义的槽函数btnstate()。

    对上面三个复选框的控件说明,如下表所示:

    实例化checkBox1和checkBox2两个对象,并将checkBox1的状态设置为选中,为checkBox1设置快捷键,使用“&"符号,如“&Checkbox 1",则通过“Alt+C"快捷键可以选中checkBox1复选框。

    实例化一个QCheckBox类对象checkBox3,然后使用setTristate()开启三态模式。

    实现代码如下所示:

    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import Qt
    
    class CheckBoxDemo(QWidget):
    
    	def __init__(self, parent=None):
    		super(CheckBoxDemo , self).__init__(parent)
    		
    		groupBox = QGroupBox("Checkboxes")
    		groupBox.setFlat( False )
    		
    		layout = QHBoxLayout()
    		self.checkBox1= QCheckBox("&Checkbox1")
    		self.checkBox1.setChecked(True)
    		self.checkBox1.stateChanged.connect( lambda:self.btnstate(self.checkBox1) )
    		layout.addWidget(self.checkBox1)
            
    		self.checkBox2 = QCheckBox("Checkbox2")
    		self.checkBox2.toggled.connect( lambda:self.btnstate(self.checkBox2) )
    		layout.addWidget(self.checkBox2)
    
    		self.checkBox3 = QCheckBox("tristateBox")
    		self.checkBox3.setTristate(True)
    		self.checkBox3.setCheckState(Qt.PartiallyChecked )		
    		self.checkBox3.stateChanged.connect( lambda:self.btnstate(self.checkBox3) )
    		layout.addWidget(self.checkBox3)
            
    		groupBox.setLayout(layout)
    		mainLayout = QVBoxLayout()
    		mainLayout.addWidget(groupBox)
    		
    		self.setLayout(mainLayout)
    		self.setWindowTitle("checkbox demo")
    	
    	def btnstate(self,btn ):
    		chk1Status = self.checkBox1.text()+", isChecked="+  str( self.checkBox1.isChecked() ) + ', chekState=' + str(self.checkBox1.checkState())   +"\n"		 
    		chk2Status = self.checkBox2.text()+", isChecked="+  str( self.checkBox2.isChecked() ) + ', checkState=' + str(self.checkBox2.checkState())   +"\n"	
    		chk3Status = self.checkBox3.text()+", isChecked="+  str( self.checkBox3.isChecked() ) + ', checkState=' + str(self.checkBox3.checkState())   +"\n"			
    		print(chk1Status + chk2Status + chk3Status )
    
    if __name__ == '__main__':
    	app = QApplication(sys.argv)
    	checkboxDemo = CheckBoxDemo()
    	checkboxDemo.show()
    	sys.exit(app.exec_())
    展开全文
  • submit和button,二者都以按钮形式展现,看起来都是按钮,所不同的是type属性和处发响应的事件上,submit会提交表单,button不会提交表单. 两者主要区别在于: submit默认为form提交,可以提交表单
  • 【干货】Ugui Button按钮的选择状态详解以及可替代方案

    前言

    写这篇文章的契机是因为要实现一个按钮交互的不同状态的视觉反馈,在深入了解了Button的原生选择状态后发现,这里面暗藏玄机,值得留下一笔。

    Button 状态属性介绍

    在Inspector面板中可以看到,unity提供了该按钮的五种状态,分别是:

    • Normal:普通状态,即什么也发现
    • Highlighted:高亮状态,即pointer进入按钮后,没有按下等其他操作
    • Pressed:按下状态,即pointer在按钮内按下
    • Disabled:禁用状态,对应参数Interactable(是否可交互)

    并且在Transition中可以选择状态的表现形式,分别为

    • Color Tint:颜色过渡
    • Sprite Swap:图片过渡
    • Animation:动画过渡

    玄机之处

    按钮的选择状态改变由谁决定的呢,这里就要进入Unity的底层代码查看了。

    负责选择状态的判断和实现逻辑都是在”Selectable.cs”脚本里完成,其中里面有个参数名为“currentSelectionState”,这个就是这篇文章的主人公了。这里面可以很清楚的看到,指针的不同事件触发对应着currentSelectionState不同的状态。
    在这里插入图片描述

    有了上述的了解,回到按钮的表现层来仔细观察一下所说的“暗藏玄机”的地方。

    为了方便讲解,我把按钮的状态做了可视化的显示(后文有在线体验连接)。
    在这里插入图片描述
    通过对按钮不同的交互可以发现:

    • 按钮一开始默认是Normal状态,当指针进入按钮后(OnPointerEnter),会立即触发Highlighted状态。如果此时没有做按下的动作,离开按钮(OnPointerExit),则会返回到Normal状态
    • 其次,如果当指针进入了按钮后,并且执行了按下(OnPointerDown)的动作且没有松开指针(OnPointerUp)的这个时间段内,按钮是处于Pressed状态。
    • 接着,在按下并且释放了指针后,按钮会由Pressed状态转成Selected状态。
    • 此时,如果指针离开按钮,或者离开后重新进入按钮,按钮会一直是Selected状态。
    • 只有当指针执行了按下的动作,Selected的状态才会被取消。也就是说,当按钮被Selected之后,只有按别的地方才能让按钮退出Selected的状态。
    • 最后,Disable状态只由Interactable的开关值来决定

    这里面”有趣“的地方,就是Selected状态。我不清楚Unity这样设计的具体原因是什么,但是可以理解为按钮被按下之后,Selected的状态其实相当于一个”lock(锁定)“状态,需要执行一步”unlock(解锁)“的动作才能将按钮返回普通状态。

    从设计的角度来看,这视觉反馈其实是与交互状态是起冲突的,对底层原理不熟悉的人,是不会顾忌这么多的。我一个按钮,交互时的状态无非就几种,哪需要管这个按钮是不是被锁定了,我要的就是鼠标移进去按钮,按钮显示为Highlighted状态,这没问题,然后点击按钮的时候,按钮显示为Pressed状态,这也没问题,可是松开之后,这锁住状态是什么鬼,我鼠标就在按钮内啊,应该是回到刚刚Highlight的状态啊,甚至是我移出去按钮,也回不去Normal状态啊,这unity什么玩意儿啊!

    也就是说,明明很简单的交互状态切换,在原本的Button上却达不到实现要求。

    可替代方案——Alternative Button

    不知道是不是会有人为了这样的效果,而写一套专门的逻辑,通过TriggerEvent对Pointer的不同事件监听然后改变按钮的颜色或者贴图,这样做不是不能实现,但是按钮一多起来的话就非常的难维护,不是一个可取的方案。

    为了达到正确的效果,并且以最小开销的方式来做的话,不妨试试以下所说的方式。

    首先需要确定的是,我的按钮只是用于“按钮”作用,不需要所谓的“Selected”判定。

    实现原理:

    因为currentSelectionState不是对外的参数,没有办法通过直接修改这个状态值达到效果。

    只能通过"Selectable.cs"提供的接口函数—— DoStateTransition() ,这个函数的作用就是当状态变化的时候执行对应的动画过渡效果,也就是我们刚刚看到的颜色变化。

    /// 底层代码
    /// <summary>
    /// Transition the Selectable to the entered state.
    /// </summary>
    /// <param name="state">State to transition to</param>
    /// <param name="instant">Should the transition occur instantly.</param>
    protected virtual void DoStateTransition(SelectionState state, bool instant)
    {
    	.....
    }
    

    有了这个接口就好办了,就可以对Button脚本进行拓展了。

    首先,可以明确的清楚现在Button所缺少的状态切换有三个地方:

    • state1:点击按钮后,如果没有离开按钮,应该切换为Highlighted状态
    • state2:点击按钮后,离开按钮瞬间,应该切换为Normal状态
    • state3:点击按钮后,离开按钮又返回按钮,应该切换为Highlighted状态

    然后,就在对应指针事件中执行改变状态的动画即可。

    state1的补充放在OnClicked事件里完成

    onClick.AddListener(() => {DoStateTransition(SelectionState.Highlighted, false); });
    

    state2的补充放在OnPointerExit里完成

    DoStateTransition(SelectionState.Normal, true);
    

    state3的补充放在OnPointerEnter里完成

    DoStateTransition(SelectionState.Highlighted, true);
    

    完整的代码如下,若要实现效果直接将该脚本替换成要实现效果的按钮的Button脚本

    using UnityEngine.EventSystems;
    using UnityEngine.UI;
    
    public class PicoButton: Button
    {
        protected override voidAwake()
        {
            base.Awake();
            onClick.AddListener(() => {DoStateTransition(SelectionState.Highlighted, false); });
        }
    
        public override void OnPointerEnter(PointerEventData eventData)
        {
            base.OnPointerEnter(eventData);
            if (interactable)
            {
    			DoStateTransition(SelectionState.Highlighted, true);
    		}
        }
    
        public override void OnPointerExit(PointerEventData eventData)
        {
            base.OnPointerExit(eventData);
            if (interactable)
            {
    			DoStateTransition(SelectionState.Normal, true);
    		}
        }
    }
    

    同样,我将改进后的Button做了可视化的显示(后文有在线体验连接)。
    在这里插入图片描述

    值得注意的是,这里实现只是从视觉上改变了状态,实际上按钮的currentSelectionState还是保持原样(即按下还是被selected了),但是Button又没有获取这个state的状态接口,所以这并不影响我们正常的交互。

    最后附上按钮Demo在线体验,可自行体验两者区别:
    ----> UguiButtonSelectionStateVisualization
    在这里插入图片描述

    展开全文
  • iOS 9应用开发教程之ios9实现按钮的响应
  • buttonST 按钮

    千次阅读 2016-11-21 14:29:28
    VC++ MFC 按钮的全部样式Style 转载地址:http://www.cnblogs.com/lujin49/p/4691107.html  Button Style  BS_3STATE 与复选框一样本样式按钮可被单击变暗。变暗状态通常用于指示本样式的按键正处于禁用状态。 ...
  • Python tkinter - 第五章 按钮控件(Button)属性

    万次阅读 多人点赞 2019-09-07 08:02:09
    按钮是一个标准的tkinter控件。按钮上可以显示文字或者图片作为提示信息。文字只能使用一种字体以及颜色。按钮的最主要作用是被点击后,可以调用指定的回调函数,完成特定的功能。比如,关闭窗口、执行命令等。...
  • 在前两篇分别介绍了如何使用内部类和匿名内部类去实现按钮点击,链接在下面: 使用内部类实现按钮点击事件 使用匿名内部类实现按钮点击事件 **今天我们了解下剩下两种常见的实现方式: 如何通过activity实现按钮...
  • 方法一:domain.yml定义buttons。方法二:自定义动作
  • java按钮组件(JButton、JCheckBox)

    千次阅读 2019-12-18 10:08:31
    按钮在Swing是比较常见的组件,用于触发特定动作,Swing提供多种按钮组件,如按钮、单选按钮、复选框等,这些按钮都是从AbstractButton类继承而来的,下面将讲解这些按钮的应用。 1.JButton按钮组件 Swing...
  • Qt绘制圆形按钮

    千次阅读 2020-05-13 18:36:12
    关于Qt下绘制按钮的文章不少,这里简单介绍一个怎么绘制圆形⭕️的按钮并在点击时候改变颜色的方法。先上图,如下: ...==》2 当鼠标移动到按钮上时的状态 ==》3、点击圆形按钮时的状态   其他的
  • openDialog()确定按钮点击事件

    万次阅读 2018-09-17 14:47:58
    openDialog()确定按钮点击事件 本文是我在开发过程,遇到的也是我不知道的知识,所以此篇仅当做自己以后借鉴用的,如果能对看官你也有用,荣幸之至。 form.ajaxSubmit 首先,在jeeplusxxxform.jsp文件...
  • 那么我们就可以在setOnClickListener方法直接new出来一个接口,当然这样肯定是可以 的,这就是今天我们的通过匿名内部类去实现按钮点击事件的方法。 老规矩,首先给大家奉上JAVA代码~ public class But
  • 动作(单独的组件) 按钮增加-增加输入值 减少按钮-减少输入值 按钮保存 保存输入值 按钮还原 恢复先前保存的号码并设置为输入字段 如果没有保存的值-0 如果未进行任何更改,则禁用 表格应刷新 项目设置 npm ...
  • * * Photoshop CS6 项目任务教程 在动作调板创建的动作可以应用与其他与之模式相同的文件如此一来便为大家节省了大量的时间执行菜单窗口/动作命令即可打开动作调板该调板的存在形式以标准模式和按钮模式两种形式...
  • Qt下 圆形按钮的绘制

    万次阅读 2018-01-28 22:28:21
    先上图,如下:==》1 圆形按钮初始状态(未被点击且鼠标未移动到按钮上) ==》2 当鼠标移动到按钮上时的状态==》3、点击圆形按钮时的状态其他的不多说了,直接上代码吧,具体细节请代码的注释信息: #ifndef ...
  • 蝎子有四个动画,默认状态下我们使用idle动画,然后设置三个按钮来控制attack、walk和run 二、Animation Controller实现动画控制 1、创建一个Image Target并改名为Scorpion,在其下面添加子对象五个button和Scorpion...
  • 菜单按钮,滑动菜单,Flash源文件 支持图标和文字的滑开菜单,Flash源文件版,压缩包内一共有三款类似的滑开式菜单效果,都附有Fla格式的源文件,效果平滑流畅,惹人喜欢,最初时候用的比较多的一种菜单形式,...
  • 表单submit和button按钮的区别!

    千次阅读 2014-07-22 11:29:25
    submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了。 如果表单在点击提交按钮后需要用JS进行处理(包括输入验证)后再提交的话,通常都必须把submit改成button,即取消其自动提交的行为,...
  • JAVA按钮组件(1)

    2019-10-15 17:44:11
    按钮在Swing是较为常见的组件,用于触发特定动作。Swing提供多种按钮,包括提交按钮、复选框、单选按钮等,这些按钮都是从AbstractButton类继承而来。 提交按钮组件 Swing的提交按钮(JButton)由JButton...
  • BS_3STATE 与复选框一样本样式按钮可被单击变暗。变暗状态通常用于指示本样式的按键正处于禁用状态。 BS_AUTO3STATE 与三状态的复选框一样当用户选中它本按钮样式状态外观会改变。 BS_AUTOCHECKBOX 与复选框一样...
  • 按钮添加点击事件的多种方式

    千次阅读 2017-01-07 17:06:38
    传入一个匿名内部类的形式。 这个匿名类 View.OnClickListener 其实是一个接口,我们可以自己写一个类实现这个接口。 // 我们自己 写一个OnClickListener的类 class MyOnclickListener implements ...
  • 原本计划实现这样一个需求: 前台点击触发某业务动作,需要用户补充信息,不做跳转页面,弹窗的形式进行补充信息。 折腾出来了,但是最终没有用到。 代码还有些毛躁,提供大概实现逻辑。  实现思路:在窗口铺上...
  • Java标签、按钮按钮事件简介

    千次阅读 2018-08-03 14:12:48
    标签和按钮也许是图形界面最常见的两种组件,按钮又总是与激发动作事件有关。 标签 标签(JLabel)是最简单的Swing组件。标签对象的作用是对位于其后的界面组件作说明。可以设置标签的属性,即前景色,背景色、...
  • 通常我们使用toolbar时,添加一个按钮toolbutton,会以文字或图标形式显示,但是如果想要以图标加文字显示,就需要用到Qt::ToolButtonStyle属性。 Constant Description 描述 Qt::...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,404
精华内容 21,761
热门标签
关键字:

属于动作按钮中的按钮形式