MX学习(一):Clutter Button的使用

  Mx没有文档,但是NBTK有,我们可以使用NBTK的文档,只要将nbtk都换成为mx就可以。

  先来看看button的使用,下面是一个使用的例子。我们在stage上创建两个clutter button,一个是toggle button,即点击后button的状态变成按下,在点击恢复,一个是普通的button(button1),鼠标移到上面可以浮现解析。button的触发信号,有clicked和long press两种方式。long press比较特别。只要鼠标按下,就会触发long press,进入MX_LONG_PRESS_QUERY状态,即进入询问是否是long press,如果不是,很快释放按键,则触发第二次long press,为MX_LONG_PRESS_CANCEL,如果确实是长按键,也将出发第二次,即MX_LONG_PRESS_ACTION。所以一次按键,将会触发两次long press。clicked是button的常用触发方式,在释放鼠标时触发。

  可以让button同时检测这两种信号。

  在NBTK的文档中,NbtkWidget是继承ClutterActor,而NbtkButton是继承NbtkWidget,所以MxButton应具备clutter所能呈现的动态效果。

#include <linux/string.h>
#include <mx/mx.h> //mx的头文件

static int click_num = 0;
static MxButton * button , * button1;
static MxComboBox *  comboBox;

//下面long press作触发的函数,请注意函数参数,在这里我们实验了long press的三种触发状态。
gboolean button_long_press_cb (MxButton *b, gfloat x, gfloat y, MxLongPressAction action)
{
    printf("%s %s : Button <%s> was long pressed !/n",__TIME__,  __FUNCTION__,mx_button_get_label(b));
    printf("/t%f %f : ",x,y);
    switch(action){
    case MX_LONG_PRESS_QUERY :
        printf("long_press query!/n");
        break;
    case MX_LONG_PRESS_ACTION :
        printf(" it's a long press.../n");
        break;
    case MX_LONG_PRESS_CANCEL :
        printf("No, it's not  a long press.../n");
        break;
    default:
        break;
    }

  return TRUE;
}

//这是clicked的触发函数,同样请注意格式,当button1按下的时候,改变toggle按钮button的状态。
void button1_clicked_func(MxButton * b, gpointer data)
{
  
//测试获取button名字函数

    printf("%s %s : Button <%s> was clicked  !/n",__TIME__,  __FUNCTION__,mx_button_get_label (b));
    //下面学习检查和设置toggle button是否按下的两个函数
   
mx_button_set_checked ((MxButton * )button, !mx_button_get_checked ((MxButton *)button));
}

//这是clicked的触发函数,当button按下的时候,每次按键触发不同的操作来许学习mx的函数。
void button_clicked_func(MxButton * button, gpointer data)
{
    printf("%s %s : Button <%s> was clicked!/n",__TIME__,      __FUNCTION__,  mx_button_get_label(button));
    switch(++click_num){
    case 1: //学习设置button的名字
        mx_ button_set_label (button,"Hello,Moblin!");
        break;
    case 2: //实验clutter的动态效果能否加在button。
        clutter_actor_animate(CLUTTER_ACTOR(button1), CLUTTER_EASE_OUT_BOUNCE,3000,  "x", 100.0, "y", 100.0,NULL);    
        break;
    case 3:
//实验clutter的动态效果能否加在button。
        clutter_actor_animate (CLUTTER_ACTOR(button1), CLUTTER_EASE_IN_SINE, 4000, "rotation-angle-y", 360.0, NULL);
        break;
    default:
        printf("Toggle button is %s/n", mx_button_get_checked(button)?"checked":"unchecked");
        break;
    }
}

int main (int argc , char * argv[])
{
    ClutterActor * stage;

    clutter_init(&argc, & argv);
    stage = clutter_stage_get_default();
    button =  mx_ button_new_with_label ("Hello World!"); //创建button
    clutter_container_add_actor(CLUTTER_CONTAINER(stage), CLUTTER_ACTOR(button));

    button1 = (MxButton *) mx_button_new_with_label("你好,朋友!");
    clutter_container_add_actor(CLUTTER_CONTAINER(stage), CLUTTER_ACTOR(button1));
    clutter_actor_set_position(CLUTTER_ACTOR(button1), 150, 0);
    mx_button_set_toggle_mode (button,TRUE); //将button设置为toggle button
    mx_widget_set_tooltip_text ((MxWidget *) button1, "改变Hello,Moblin的check状态"); //设置提示信息

    g_signal_connect(button,"clicked ",G_CALLBACK(button_clicked_func),NULL);
    g_signal_connect(button1,"clicked ",G_CALLBACK(button1_clicked_func),NULL);
    g_signal_connect(button,"long-press ",G_CALLBACK(button_long_press_cb),NULL);
    g_signal_connect(button1,"long-press ",G_CALLBACK(button_long_press_cb),NULL);


    clutter_actor_show(stage);
    clutter_main();
    return 0;
}

 

相关链接:我的Clutter相关博客

 

你可能感兴趣的:(null,action,callback,actor,button,Signal)