Android 菜单(OptionMenu)大全 建立你自己的菜单_android menu grid-程序员宅基地

技术标签: android  菜单  menu  programming  

 菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu),今天这讲是OptionsMenu 

  一、概述

  public boolean onCreateOptionsMenu(Menu menu):使用此方法调用OptionsMenu 。

  public boolean onOptionsItemSelected(MenuItem item):选中菜单项后发生的动作。

  public void onOptionsMenuClosed(Menu menu):菜单关闭后发生的动作。

  public boolean onPrepareOptionsMenu(Menu menu):选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。

  public boolean onMenuOpened(int featureId, Menu menu):单打开后发生的动作。

  二、默认样式

  默认样式是在屏幕底部弹出一个菜单,这个菜单我们就叫他选项菜单OptionsMenu,一般情况下,选项菜单最多显示2排每排3个菜单项,这些菜单项有文字有图标,也被称作Icon Menus,如果多于6项,从第六项开始会被隐藏,在第六项会出现一个More里,点击More才出现第六项以及以后的菜单项,这些菜单项也被称作Expanded Menus。下面介绍。

  

复制代码
       
       
        
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< LinearLayout xmlns:android = " http://schemas.android.com/apk/res/android "
android:orientation
= " vertical " android:layout_width = " fill_parent "
android:layout_height
= " fill_parent " >

< TextView android:layout_width = " wrap_content "
android:layout_height
= " wrap_content " android:text = " 请点击 Menu键显示选项菜单 "
android:id
= " @+id/TextView02 " />

</ LinearLayout >
复制代码

  2。重载onCreateOptionsMenu(Menu menu)方法

  重载onCreateOptionsMenu(Menu menu)方法,并在此方法中添加菜单项,最后返回true,如果false,菜单则不会显示。

  

复制代码
       
       
        
@Override
public boolean onCreateOptionsMenu(Menu menu) {
/*
*
* add()方法的四个参数,依次是:
*
* 1、组别,如果不分组的话就写Menu.NONE,
*
* 2、Id,这个很重要,Android根据这个Id来确定不同的菜单
*
* 3、顺序,那个菜单现在在前面由这个参数的大小决定
*
* 4、文本,菜单的显示文本
*/

menu.add(Menu.NONE, Menu.FIRST
+ 1 , 5 , " 删除 " ).setIcon(

android.R.drawable.ic_menu_delete);

// setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以

// android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的

menu.add(Menu.NONE, Menu.FIRST
+ 2 , 2 , " 保存 " ).setIcon(

android.R.drawable.ic_menu_edit);

menu.add(Menu.NONE, Menu.FIRST
+ 3 , 6 , " 帮助 " ).setIcon(

android.R.drawable.ic_menu_help);

menu.add(Menu.NONE, Menu.FIRST
+ 4 , 1 , " 添加 " ).setIcon(

android.R.drawable.ic_menu_add);

menu.add(Menu.NONE, Menu.FIRST
+ 5 , 4 , " 详细 " ).setIcon(

android.R.drawable.ic_menu_info_details);

menu.add(Menu.NONE, Menu.FIRST
+ 6 , 3 , " 发送 " ).setIcon(

android.R.drawable.ic_menu_send);

return true ;

}
复制代码

  3。为菜单项注册事件

  使用onOptionsItemSelected(MenuItem item)方法为菜单项注册事件

复制代码
       
       
        
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {

case Menu.FIRST + 1 :

Toast.makeText(
this , " 删除菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 2 :

Toast.makeText(
this , " 保存菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 3 :

Toast.makeText(
this , " 帮助菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 4 :

Toast.makeText(
this , " 添加菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 5 :

Toast.makeText(
this , " 详细菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 6 :

Toast.makeText(
this , " 发送菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

}

return false ;

}
复制代码

  4。其他按需要重载

  完整代码

复制代码
       
       
        
package com.wjq.menu;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class DefaultMenu extends Activity {
/* * Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
/*
*
* add()方法的四个参数,依次是:
*
* 1、组别,如果不分组的话就写Menu.NONE,
*
* 2、Id,这个很重要,Android根据这个Id来确定不同的菜单
*
* 3、顺序,那个菜单现在在前面由这个参数的大小决定
*
* 4、文本,菜单的显示文本
*/

menu.add(Menu.NONE, Menu.FIRST
+ 1 , 5 , " 删除 " ).setIcon(

android.R.drawable.ic_menu_delete);

// setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以

// android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的

menu.add(Menu.NONE, Menu.FIRST
+ 2 , 2 , " 保存 " ).setIcon(

android.R.drawable.ic_menu_edit);

menu.add(Menu.NONE, Menu.FIRST
+ 3 , 6 , " 帮助 " ).setIcon(

android.R.drawable.ic_menu_help);

menu.add(Menu.NONE, Menu.FIRST
+ 4 , 1 , " 添加 " ).setIcon(

android.R.drawable.ic_menu_add);

menu.add(Menu.NONE, Menu.FIRST
+ 5 , 4 , " 详细 " ).setIcon(

android.R.drawable.ic_menu_info_details);

menu.add(Menu.NONE, Menu.FIRST
+ 6 , 3 , " 发送 " ).setIcon(

android.R.drawable.ic_menu_send);

return true ;

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {

case Menu.FIRST + 1 :

Toast.makeText(
this , " 删除菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 2 :

Toast.makeText(
this , " 保存菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 3 :

Toast.makeText(
this , " 帮助菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 4 :

Toast.makeText(
this , " 添加菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 5 :

Toast.makeText(
this , " 详细菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

case Menu.FIRST + 6 :

Toast.makeText(
this , " 发送菜单被点击了 " , Toast.LENGTH_LONG).show();

break ;

}

return false ;

}

@Override
public void onOptionsMenuClosed(Menu menu) {
Toast.makeText(
this , " 选项菜单关闭了 " , Toast.LENGTH_LONG).show();
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
Toast.makeText(
this ,
" 选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单 " ,
Toast.LENGTH_LONG).show();

// 如果返回false,此方法就把用户点击menu的动作给消费了,onCreateOptionsMenu方法将不会被调用

return true ;

}
}
复制代码

5.效果浏览

  

  三、自定义样式

  

复制代码
       
       
        
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< LinearLayout xmlns:android = " http://schemas.android.com/apk/res/android "
android:orientation
= " vertical "
android:layout_width
= " fill_parent "
android:layout_height
= " fill_parent "
>
< GridView
android:id
= " @+id/gridview "
android:layout_width
= " fill_parent "
android:layout_height
= " fill_parent "
android:numColumns
= " 4 "
android:verticalSpacing
= " 10dip "
android:horizontalSpacing
= " 10dip "
android:stretchMode
= " columnWidth "
android:gravity
= " center "
/>

</ LinearLayout >
复制代码

   首先自定义菜单界面,我是GridView来包含菜单项,4列3行

  

复制代码
       
       
        
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< RelativeLayout xmlns:android = " http://schemas.android.com/apk/res/android "
android:id
= " @+id/RelativeLayout_Item "
android:layout_width
= " fill_parent " android:layout_height = " wrap_content "
android:paddingBottom
= " 5dip " >
< ImageView android:id = " @+id/item_image "
android:layout_centerHorizontal
= " true " android:layout_width = " wrap_content "
android:layout_height
= " wrap_content " ></ ImageView >
< TextView android:layout_below = " @id/item_image " android:id = " @+id/item_text "
android:layout_centerHorizontal
= " true " android:layout_width = " wrap_content "
android:layout_height
= " wrap_content " android:text = " 选项 " ></ TextView >
</ RelativeLayout >
复制代码

菜单项的现实样式,一个图标和一个文字。

  3.定义

  

复制代码
       
       
        
private boolean isMore = false ; // menu菜单翻页控制
AlertDialog menuDialog; // menu菜单Dialog
GridView menuGrid;
View menuView;

private final int ITEM_SEARCH = 0 ; // 搜索
private final int ITEM_FILE_MANAGER = 1 ; // 文件管理
private final int ITEM_DOWN_MANAGER = 2 ; // 下载管理
private final int ITEM_FULLSCREEN = 3 ; // 全屏
private final int ITEM_MORE = 11 ; // 菜单


/* * 菜单图片 * */
int [] menu_image_array = { R.drawable.menu_search,
R.drawable.menu_filemanager, R.drawable.menu_downmanager,
R.drawable.menu_fullscreen, R.drawable.menu_inputurl,
R.drawable.menu_bookmark, R.drawable.menu_bookmark_sync_import,
R.drawable.menu_sharepage, R.drawable.menu_quit,
R.drawable.menu_nightmode, R.drawable.menu_refresh,
R.drawable.menu_more };
/* * 菜单文字 * */
String[] menu_name_array
= { " 搜索 " , " 文件管理 " , " 下载管理 " , " 全屏 " , " 网址 " , " 书签 " ,
" 加入书签 " , " 分享页面 " , " 退出 " , " 夜间模式 " , " 刷新 " , " 更多 " };
/* * 菜单图片2 * */
int [] menu_image_array2 = { R.drawable.menu_auto_landscape,
R.drawable.menu_penselectmodel, R.drawable.menu_page_attr,
R.drawable.menu_novel_mode, R.drawable.menu_page_updown,
R.drawable.menu_checkupdate, R.drawable.menu_checknet,
R.drawable.menu_refreshtimer, R.drawable.menu_syssettings,
R.drawable.menu_help, R.drawable.menu_about, R.drawable.menu_return };
/* * 菜单文字2 * */
String[] menu_name_array2
= { " 自动横屏 " , " 笔选模式 " , " 阅读模式 " , " 浏览模式 " , " 快捷翻页 " ,
" 检查更新 " , " 检查网络 " , " 定时刷新 " , " 设置 " , " 帮助 " , " 关于 " , " 返回 " };
复制代码
复制代码
       
       
        
@Override
public boolean onMenuOpened( int featureId, Menu menu) {
if (menuDialog == null ) {
menuDialog
= new AlertDialog.Builder( this ).setView(menuView).show();
}
else {
menuDialog.show();
}
return false ; // 返回为true 则显示系统menu
}
复制代码

如果第一次打开则设置视图,否则直接显示menuDialog视图。

  

复制代码
       
       
        
private SimpleAdapter getMenuAdapter(String[] menuNameArray,
int [] imageResourceArray) {
ArrayList
< HashMap < String, Object >> data = new ArrayList < HashMap < String, Object >> ();
for ( int i = 0 ; i < menuNameArray.length; i ++ ) {
HashMap
< String, Object > map = new HashMap < String, Object > ();
map.put(
" itemImage " , imageResourceArray[i]);
map.put(
" itemText " , menuNameArray[i]);
data.add(map);
}
SimpleAdapter simperAdapter
= new SimpleAdapter( this , data,
R.layout.item_menu,
new String[] { " itemImage " , " itemText " },
new int [] { R.id.item_image, R.id.item_text });
return simperAdapter;
}
复制代码

为菜单添加菜单项。

       
       
        
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(
" menu " ); // 必须创建一项
return super.onCreateOptionsMenu(menu);
}
复制代码
       
       
        
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

setContentView(R.layout.main);

menuView
= View.inflate( this , R.layout.gridview_menu, null );
// 创建AlertDialog
menuDialog = new AlertDialog.Builder( this ).create();
menuDialog.setView(menuView);
menuDialog.setOnKeyListener(
new OnKeyListener() {
public boolean onKey(DialogInterface dialog, int keyCode,
KeyEvent
event ) {
if (keyCode == KeyEvent.KEYCODE_MENU) // 监听按键
dialog.dismiss();
return false ;
}
});

menuGrid
= (GridView) menuView.findViewById(R.id.gridview);
menuGrid.setAdapter(getMenuAdapter(menu_name_array, menu_image_array));
/* * 监听menu选项 * */
menuGrid.setOnItemClickListener(
new OnItemClickListener() {
public void onItemClick(AdapterView <?> arg0, View arg1, int arg2,
long arg3) {
switch (arg2) {
case ITEM_SEARCH: // 搜索

break ;
case ITEM_FILE_MANAGER: // 文件管理

break ;
case ITEM_DOWN_MANAGER: // 下载管理

break ;
case ITEM_FULLSCREEN: // 全屏

break ;
case ITEM_MORE: // 翻页
if (isMore) {
menuGrid.setAdapter(getMenuAdapter(menu_name_array2,
menu_image_array2));
isMore
= false ;
}
else { // 首页
menuGrid.setAdapter(getMenuAdapter(menu_name_array,
menu_image_array));
isMore
= true ;
}
menuGrid.invalidate();
// 更新menu
menuGrid.setSelection(ITEM_MORE);
break ;
}


}
});
}
复制代码
复制代码
       
       
        
package com.wjq.menu;


import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnKeyListener;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;

public class CustomizeMenu extends Activity {

private boolean isMore = false ; // menu菜单翻页控制
AlertDialog menuDialog; // menu菜单Dialog
GridView menuGrid;
View menuView;

private final int ITEM_SEARCH = 0 ; // 搜索
private final int ITEM_FILE_MANAGER = 1 ; // 文件管理
private final int ITEM_DOWN_MANAGER = 2 ; // 下载管理
private final int ITEM_FULLSCREEN = 3 ; // 全屏
private final int ITEM_MORE = 11 ; // 菜单


/* * 菜单图片 * */
int [] menu_image_array = { R.drawable.menu_search,
R.drawable.menu_filemanager, R.drawable.menu_downmanager,
R.drawable.menu_fullscreen, R.drawable.menu_inputurl,
R.drawable.menu_bookmark, R.drawable.menu_bookmark_sync_import,
R.drawable.menu_sharepage, R.drawable.menu_quit,
R.drawable.menu_nightmode, R.drawable.menu_refresh,
R.drawable.menu_more };
/* * 菜单文字 * */
String[] menu_name_array
= { " 搜索 " , " 文件管理 " , " 下载管理 " , " 全屏 " , " 网址 " , " 书签 " ,
" 加入书签 " , " 分享页面 " , " 退出 " , " 夜间模式 " , " 刷新 " , " 更多 " };
/* * 菜单图片2 * */
int [] menu_image_array2 = { R.drawable.menu_auto_landscape,
R.drawable.menu_penselectmodel, R.drawable.menu_page_attr,
R.drawable.menu_novel_mode, R.drawable.menu_page_updown,
R.drawable.menu_checkupdate, R.drawable.menu_checknet,
R.drawable.menu_refreshtimer, R.drawable.menu_syssettings,
R.drawable.menu_help, R.drawable.menu_about, R.drawable.menu_return };
/* * 菜单文字2 * */
String[] menu_name_array2
= { " 自动横屏 " , " 笔选模式 " , " 阅读模式 " , " 浏览模式 " , " 快捷翻页 " ,
" 检查更新 " , " 检查网络 " , " 定时刷新 " , " 设置 " , " 帮助 " , " 关于 " , " 返回 " };
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

setContentView(R.layout.main);

menuView
= View.inflate( this , R.layout.gridview_menu, null );
// 创建AlertDialog
menuDialog = new AlertDialog.Builder( this ).create();
menuDialog.setView(menuView);
menuDialog.setOnKeyListener(
new OnKeyListener() {
public boolean onKey(DialogInterface dialog, int keyCode,
KeyEvent
event ) {
if (keyCode == KeyEvent.KEYCODE_MENU) // 监听按键
dialog.dismiss();
return false ;
}
});

menuGrid
= (GridView) menuView.findViewById(R.id.gridview);
menuGrid.setAdapter(getMenuAdapter(menu_name_array, menu_image_array));
/* * 监听menu选项 * */
menuGrid.setOnItemClickListener(
new OnItemClickListener() {
public void onItemClick(AdapterView <?> arg0, View arg1, int arg2,
long arg3) {
switch (arg2) {
case ITEM_SEARCH: // 搜索

break ;
case ITEM_FILE_MANAGER: // 文件管理

break ;
case ITEM_DOWN_MANAGER: // 下载管理

break ;
case ITEM_FULLSCREEN: // 全屏

break ;
case ITEM_MORE: // 翻页
if (isMore) {
menuGrid.setAdapter(getMenuAdapter(menu_name_array2,
menu_image_array2));
isMore
= false ;
}
else { // 首页
menuGrid.setAdapter(getMenuAdapter(menu_name_array,
menu_image_array));
isMore
= true ;
}
menuGrid.invalidate();
// 更新menu
menuGrid.setSelection(ITEM_MORE);
break ;
}


}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(
" menu " ); // 必须创建一项
return super.onCreateOptionsMenu(menu);
}

private SimpleAdapter getMenuAdapter(String[] menuNameArray,
int [] imageResourceArray) {
ArrayList
< HashMap < String, Object >> data = new ArrayList < HashMap < String, Object >> ();
for ( int i = 0 ; i < menuNameArray.length; i ++ ) {
HashMap
< String, Object > map = new HashMap < String, Object > ();
map.put(
" itemImage " , imageResourceArray[i]);
map.put(
" itemText " , menuNameArray[i]);
data.add(map);
}
SimpleAdapter simperAdapter
= new SimpleAdapter( this , data,
R.layout.item_menu,
new String[] { " itemImage " , " itemText " },
new int [] { R.id.item_image, R.id.item_text });
return simperAdapter;
}
@Override
public boolean onMenuOpened( int featureId, Menu menu) {
if (menuDialog == null ) {
menuDialog
= new AlertDialog.Builder( this ).setView(menuView).show();
}
else {
menuDialog.show();
}
return false ; // 返回为true 则显示系统menu
}

}
复制代码

原代码下载点击这里

效果浏览

          

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/apaul001/article/details/39013775

智能推荐

Cocos2d-x 窗口大小调整_cocos2dx设置窗口大小-程序员宅基地

文章浏览阅读4.2k次。打开src目录下的AppDelegate.cpp文件,若无修改则在第45行处找到全局声明的Size变量,修改`designResolutionSize`中的大小即可。_cocos2dx设置窗口大小

springboot接收枚举值的默认方式_springboot get请求怎么接收前端传递的枚举数字-程序员宅基地

文章浏览阅读1.6k次。测试代码:@PostMapping() public void test(@RequestBody Student student){ System.out.println(student.getLover().name()); }class Student{ private Lover lover; public Lover getLover() { return lover; } public void setLover_springboot get请求怎么接收前端传递的枚举数字

【数学建模笔记】【第七讲】多元线性回归分析(二):虚拟变量的设置以及交互项的解释,以及基于Stata的普通回归与标准化回归分析实例_stata两个虚拟变量的交互项-程序员宅基地

文章浏览阅读1.5w次,点赞24次,收藏120次。简单来说就是去量纲后的回归(因为你要比较不同变量之间的显著性的大小,那么带着量纲怎么比,所以先把量纲去掉,然后再比较)官话:为了更为精准的研究影响评价量的重要因素(去除量纲的影响),我们可考虑使用标准化回归系数。_stata两个虚拟变量的交互项

mysql-程序员宅基地

文章浏览阅读203次。有时候安装mysql后使用mysql命令时报错 Can't connect to MySQL server on localhost (10061),或者用net start mysql 时报服务名无效,一般是因为mysql服务没有启动。这时候可以用管理身份运行cmd.exe(注意必须是管理..._c:\program files\mysql\mysql server 5.6\bin>mysqld --install install/remove

亚信科技java笔试题答案_亚信笔试题卷以及答案.docx-程序员宅基地

文章浏览阅读6.2k次,点赞3次,收藏44次。亚信联创科技校园招聘B 卷考试时间60_分钟 _考试方式(闭)卷(本试卷满分 100 分,答案请写在答题卡上)请不要在问卷上答题或涂改,笔试结束后请务必交回试卷部分内容分值备注一、计算机基础40分C/C++语言基础40分技能部分二、二选一JAVA 语言基础40分三、数据库20分总分100 分第一部分——计算机基础一、选择题(每题 2 分,总分 40分)1.CPU 状态分为目态和管态两种..._亚信科技java实习笔试题

三线城市程序员的薪资待遇怎么样?我分享提高java技术水平的几个方法_三线城市学java-程序员宅基地

文章浏览阅读1.3k次。3年对一个程序员来说是非常重要的。像我自己本身就是做程序员的,目前的薪资待遇是13K左右,虽然在我所在的公司不是最高的,但在所在的这个城市的消费水平来说,除了日常的开支,包括房租、水电、伙食、人际交往等费用之外,还能留下一部分闲钱自己存起来。不同城市的薪资待遇是不一样的,这主要是由于当地的消费水平和经济发展水平不同,所以如果你想要更高的薪资待遇,就要考虑在一线城市或者经济发达的城市工作。一个有着丰富工作经验的程序员,他的技能水平、经验和能力都比没有经验的程序员更加出色,所以他们的薪资待遇也会更高一些。_三线城市学java

随便推点

恭迎万亿级营销(圈人)潇洒的迈入毫秒时代 - 万亿user_tags级实时推荐系统数据库设计...-程序员宅基地

文章浏览阅读418次。标签PostgreSQL , 标签 , 推荐系统 , 实时圈人 , 数组 , gin , gist , 索引 , rum , tsvector , tsquery , 万亿 , user , tag , 淘宝背景我们仅用了PostgreSQL的两个小特性,却解决了业务困扰已久的大问题。推荐系统是广告营销平台的奶牛,其核心是精准、实时、..._实时圈人

软件测试风险追踪表_软件测试风险管理表格-程序员宅基地

文章浏览阅读430次。软件测试风险追踪表风险追踪表 项目名称: 填制人: 编号 风险描述 影响 风险等级 发生的可能性 应对策略 状态 责任人 备注 ..._软件测试风险管理表格

AAC ADTS封装实现-程序员宅基地

文章浏览阅读1.2k次。一、AAC音频格式种类有哪些AAC音频格式是一种由MPEG-4标准定义的有损音频压缩格式。AAC包含两种格式 ADIF(Audio Data Interchange Format音频数据交换格式)和ADTS(Audio Data transport Stream音频数据传输流)。ADIF特点:可以确定的找到音视频数据的开始,不需要进行在音视频数据流中间开始的解码,它的解码必须在明确的定义开始。应用场景:常用在磁盘文件中。ADTS特点:具有同步字的比特流,解码可以在这个流中任何位置开始。类似于mp_aac adts

Unity基础概念_unity基本概念-程序员宅基地

文章浏览阅读213次。像要使用Resouce类,必须创建一个 Resouce 文件夹,然后把需要的资源放进去,才可以在代码中设置路径进行访问_unity基本概念

在gitlab中指定自定义 CI/CD 配置文件_gitlab配置cicd-程序员宅基地

文章浏览阅读2.4k次。指定自定义 CI/CD 配置文件,顾名思义就是在项目中指定文件来代替默认的.gitlab-ci.yml文件的方式来运行流水线。以往我们在使用流水线的时候,都是默认将.gitlab-ci.yml文件存在在项目的跟路径下,但是我们也可以指定备用文件名路径,或者不想在每个项目中来维护这个yml文件,那么通过自定义 CI/CD 配置文件便可以实现。_gitlab配置cicd

mysql出现#1063 - Incorrect column specifier for column 'id'的解决方法_sql 错误 [1063] [42000]: incorrect column specifier -程序员宅基地

文章浏览阅读1w次。出现这个表示如果设置了自动增长,字段类型应该设置为int整型。_sql 错误 [1063] [42000]: incorrect column specifier for column 'id' incorrec