Eoeclient源代码分析及代码凝视

使用滑动菜单SlidingMenu,单击滑动菜单的不同选项,能够通过ViewPager和PagerIndicator显示相应的数据内容。

0  BaseSlidingFragmentActivity.java

主要函数:

(1)showMenu()

/** * Opens the menu and shows the menu view.*/

public void showMenu() {

showMenu(true);

}

(2)showContent()

/**Closes the menu and shows the above view. */

public void showContent() {

showContent(true);

}

(3)toggle()

/**Toggle the SlidingMenu. If it is open, it will be closed, and viceversa.*/

public void toggle() {

toggle(true);

}

/**

* Toggle the SlidingMenu. If it is open, itwill be closed, and vice versa.

*

* @param animate true to animate thetransition, false to ignore animation

*/

public void toggle(booleananimate) {

if (isMenuShowing()) {

showContent(animate);

} else {

showMenu(animate);

}

}

(4)

//设置SlidingMenu使用的布局

publicvoid setBehindContentView(int id)
{

setBehindContentView(getLayoutInflater().inflate(id,null));

}

public
void
setBehindContentView(View v) {

setBehindContentView(v, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

}

public
void
setBehindContentView(View v, LayoutParams params) {

mHelper.setBehindContentView(v, params);

}

//获取与该Acitivity相关的SlidingMenu对象

public SlidingMenu getSlidingMenu() {

returnmHelper.getSlidingMenu();

}

1.   behind_sldingmenu.xml 滑动菜单的部分页面布局文件

滑动菜单主要由一个标题布局(@layout/behinf_title)、菜单选项列表布局和两个自己定义图形button等控件元素组成

<FrameLayoutxmlns: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:background="#dadada"

android:orientation="vertical">

<!--sliding menu layout -->

<includelayout="@layout/behind_title"/>

<ListView

android:id="@+id/behind_list_show"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_gravity="top"

android:layout_marginBottom="@dimen/list_margin_height"

android:layout_marginTop="@dimen/title_height"

android:divider="@drawable/dis_behind_side"

android:listSelector="#0fff"

android:cacheColorHint="#0000">

</ListView>

</FrameLayout>

2.   初始化滑动菜单

private SlidingMenu sm;

// [start]初始化函数

private
void
initSlidingMenu() {

//设置滑动菜单的布局文件

setBehindContentView(R.layout.behind_slidingmenu);

// 获取滑动菜单对象并设置外观属性customize the SlidingMenu

sm =
getSlidingMenu();

sm.setShadowWidthRes(R.dimen.shadow_width);

sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);

// sm.setFadeDegree(0.35f);

sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);

sm.setShadowDrawable(R.drawable.slidingmenu_shadow);

//sm.setShadowWidth(20);

sm.setBehindScrollScale(0);

}

3.   显示菜单:

(1)单击主界面左上角的LinearLayout控件

//  fromabove_title.xml  -- > pop up slidingmenu   (showMenu() )

llGoHome = (LinearLayout) findViewById(R.id.Linear_above_toHome);

@Override

public
void
onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.Linear_above_toHome:

showMenu();

break;

}

}

(2)单击手机的菜单选项

@Override

public
boolean
onKeyDown(int keyCode, KeyEventevent) {

else
if
(keyCode == KeyEvent.KEYCODE_MENU) {

if (sm.isMenuShowing()) {

toggle();

} else {

showMenu();

}

}

}

4. 设置填充滑动菜单中列表项数据的适配器

4.1 behind_list_show.xml (每个列表项的布局)

每个列表项(子菜单选项)由一个ImageView(子菜单图标)和TextView(子菜单名称)组成

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="@dimen/behind_list_height"

android:orientation="horizontal"

android:background="@drawable/back_behind_listitem_style">

<ImageView

android:id="@+id/imageview_behind_icon"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:src="@drawable/dis_menu_blog"

android:scaleType="fitCenter"

android:layout_marginLeft="10dp"

android:layout_marginRight="10dp"/>

<TextView

android:id="@+id/textview_behind_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_vertical"

android:textColor="#666"

android:textSize="@dimen/behind_list_text_size"/>

</LinearLayout>

4.2定义getData函数获取填充列表项的数据List

private List<Map<String, Object>> getData() {

List<Map<String, Object>>list = new ArrayList<Map<String, Object>>();

//社区精选

Map<String, Object> map = new HashMap<String,Object>();

map.put(LIST_TEXT, getResources().getString(R.string.menuGood));

map.put(LIST_IMAGEVIEW, R.drawable.dis_menu_handpick);

list.add(map);

//新闻资讯

map = new HashMap<String, Object>();

map.put(LIST_TEXT, getResources().getString(R.string.menuNews));

map.put(LIST_IMAGEVIEW, R.drawable.dis_menu_news);

list.add(map);

//学习教程

map = new HashMap<String, Object>();

map.put(LIST_TEXT, getResources().getString(R.string.menuStudio));

map.put(LIST_IMAGEVIEW, R.drawable.dis_menu_studio);

list.add(map);

//社区博客

map = new HashMap<String, Object>();

map.put(LIST_TEXT, getResources().getString(R.string.menuBlog));

map.put(LIST_IMAGEVIEW, R.drawable.dis_menu_blog);

list.add(map);

return list;

}

4.3定义列表项数据填充适配器

SimpleAdapter lvAdapter =
new
SimpleAdapter(this, getData(),

R.layout.behind_list_show,new String[]{LIST_TEXT,

LIST_IMAGEVIEW},

new
int
[]{R.id.textview_behind_title,

R.id.imageview_behind_icon}) {

@Override

publicView getView(int position, View convertView, ViewGroupparent) {

View view = super.getView(position,convertView, parent);

//假设是当前选中的子菜单项

if (position ==mTag) {

//设置新的背景图片  标识该菜单选项被选中

view.setBackgroundResource(R.drawable.back_behind_list);

lvTitle.setTag(view);//绑定当前选中的子菜单选项到lvTitle上

} else {

view.setBackgroundColor(Color.TRANSPARENT);

}

return view;

}

};

5.  单击滑动菜单中的列表项 启动不同的ViewPager

(1)NavigationModel  类的定义

package cn.eoe.app.entity;

public
class
NavigationModel {

private Stringname;

//作为唯一标识符 newsblog wiki
方便于每一个页面请求相相应的地址

private Stringtags;

public NavigationModel(String name1,String tags1){

this.name = name1;

this.tags = tags1;

}

}

(2)创建NavigationModel 对象,并加入四个子菜单相应的数据(name,tag)

private List<NavigationModel> navs;

private
void
initNav() {

navs = new ArrayList<NavigationModel>();

NavigationModel nav1 =new
NavigationModel(getResources().getString(

R.string.menuGood),"");

NavigationModel nav2 =new
NavigationModel(getResources().getString(

R.string.menuNews), Constants.TAGS.NEWS_TAG);

NavigationModel nav3 =new
NavigationModel(getResources().getString(

R.string.menuStudio),Constants.TAGS.WIKI_TAG);

NavigationModel nav4 =new
NavigationModel(getResources().getString(

R.string.menuBlog),Constants.TAGS.BLOG_TAG);

Collections.addAll(navs, nav1, nav2, nav3, nav4);

}

(3)初始化列表项数据

MainActivity.java

initialListView(){}

lvAdapter = new SimpleAdapter(this, getData(),

R.layout.behind_list_show,new String[]{LIST_TEXT,

LIST_IMAGEVIEW},

new
int
[]{R.id.textview_behind_title,

R.id.imageview_behind_icon});

lvTitle.setAdapter(lvAdapter);

(4)列表项单击事件监听函数

lvTitle.setOnItemClickListener(new OnItemClickListener() {

@Override

public
void
onItemClick(AdapterView<?> parent,View view,

int position,long id) {

NavigationModel navModel =
navs.get(position);

mAboveTitle.setText(navModel.getName());

current_page = navModel.getTags();

if (lvTitle.getTag() !=null) {

if (lvTitle.getTag() == view) {

//假设本次单击的子菜单选项(view)和上一次选择的子菜单选项(lvTitle.getTag())同样,则直接显示当前子菜单项相应的内容

MainActivity.this.showContent();

return;

}

//若果不同样,又一次将原来菜单选项的背景色改为透明

((View) lvTitle.getTag())

.setBackgroundColor(Color.TRANSPARENT);

}

lvTitle.setTag(view);//又一次绑定新的子菜单选项到lvTitle上

//设置新的背景图片  标识该菜单选项被选中

view.setBackgroundResource(R.drawable.back_behind_list);

imgQuery.setVisibility(View.VISIBLE);

//依据选择的不同子菜单选项运行不同的异步任务,显示相应的数据内容

switch (position) {

case 0:

imgQuery.setVisibility(View.GONE);

newMyTask().execute(topDao);

break;

case 1:

newMyTask().execute(newsDao);

break;

case 2:

newMyTask().execute(wikiDao);

break;

case 3:

new MyTask().execute(blogsDao);

break;

}

}

});

6. 分离出来的模板样例

在MainActivity中显示选中的滑动菜单选项的名称

(1) main.xml (MainActivity)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"> <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/sso_topbar"
>
<ImageButton
android:layout_marginLeft="5dip"
android:layout_centerVertical="true"
android:id="@+id/imgbtn_top_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/v5_0_1_flipper_head_flip"/>
<TextView
android:layout_toRightOf="@id/imgbtn_top_left"
android:id="@+id/tv_top_center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_top_center"
android:textColor="@color/whilte"
android:layout_centerVertical="true"
android:layout_marginLeft="25dip" />
<ImageButton
android:id="@+id/imgbtn_top_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/feed_refresh_arrow_pressed"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dip"/>
</RelativeLayout> <TextView
android:id="@+id/show_submenu_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/> </LinearLayout>

(2)fragment_left_bottom.xml (滑动菜单的布局文件)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/renren_news_first_image_bg"
android:orientation="vertical" >
<!-- 顶部头像,姓名。标签 -->
<include layout="@layout/left_bottom_top" />
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<!-- 经常使用 -->
<TextView
android:id="@+id/left_tv_commom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="3dip"
android:paddingLeft="20dip"
android:paddingTop="3dip"
android:text="@string/left_bottom_commom"
android:textColor="@color/whilte" /> <ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/v5_0_1_divider_new"/>
<!-- 经常使用列表 --><!-- 经常使用列表与很多其它列表使用同一个item布局 自己定义适配器 -->
<com.pps.myrenren.custom.MyListView
android:id="@+id/listview_common"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:divider="@drawable/v5_0_1_divider_line_new"/>
<TextView
android:id="@+id/left_tv_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="3dip"
android:paddingLeft="20dip"
android:paddingTop="3dip"
android:text="@string/left_bottom_more"
android:textColor="@color/whilte" />
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/v5_0_1_divider_new"/>
<!-- 很多其它列表 -->
<com.pps.myrenren.custom.MyListView
android:id="@+id/listview_more"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:divider="@drawable/v5_0_1_divider_line_new"/>
<!-- <TextView
android:id="@+id/left_tv_recommend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="3dip"
android:paddingLeft="20dip"
android:paddingTop="3dip"
android:text="@string/left_bottom_recommend"
android:textColor="@color/whilte" />
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/v5_0_1_divider_line_new"/> <ListView
android:id="@+id/listview_recommend"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:divider="@drawable/v5_0_1_divider_new"/>
<TextView
android:id="@+id/left_tv_app"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="3dip"
android:paddingLeft="20dip"
android:paddingTop="3dip"
android:text="@string/left_bottom_app"
android:textColor="@color/whilte" /> <ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/v5_0_1_divider_line_new"/> <ListView
android:id="@+id/listview_app"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:divider="@drawable/v5_0_1_divider_new"/> -->
<TextView
android:id="@+id/left_tv_setting"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="3dip"
android:paddingLeft="20dip"
android:paddingTop="3dip"
android:text="@string/left_bottom_setting"
android:textColor="@color/whilte" />
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/v5_0_1_divider_new"/>
<com.pps.myrenren.custom.MyListView
android:id="@+id/listview_setting"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:divider="@drawable/v5_0_1_divider_line_new"/>
</LinearLayout>
</ScrollView> </LinearLayout>

(3) menu_frame.xml  滑动菜单布局文件(装载Fragment的FrameLayout容器)

<?

xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />

(4) MainActivity.java

Key:在Activtiy中实如今(5)中[LeftBottomFragment.java]定义的回调方法

package com.pps.myrenren.activity;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.TextView; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity; public class MainActivity extends SlidingFragmentActivity implements LeftBottomFragment.SLMenuListOnItemClickListener{
private ImageButton imgbtn_top_left;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main); imgbtn_top_left=(ImageButton)this.findViewById(R.id.imgbtn_top_left);
imgbtn_top_left.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*Tip1: Toggle the SlidingMenu. If it is open, it will be closed, and vice versa.*/
toggle();
}
});
//Initial Sliding Menu
initSlidingMenu(savedInstanceState);
} //0628
@Override
public void selectItem(int position,String title){ //toggle();
showContent();//hide the menu
TextView tv = (TextView)findViewById(R.id.show_submenu_content);
tv.setText(title);
}
/**
* Initial Sliding Menu
*/
private void initSlidingMenu(Bundle savedInstanceState) {
// 设置滑动菜单的视图
setBehindContentView(R.layout.menu_frame);
getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame, new LeftBottomFragment()).commit();
// 实例化滑动菜单对象
SlidingMenu sm = getSlidingMenu();
// 设置滑动阴影的宽度
sm.setShadowWidthRes(R.dimen.shadow_width);
// 设置滑动阴影的图像资源
sm.setShadowDrawable(R.drawable.shadow);
// 设置滑动菜单视图的宽度
sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);
// 设置渐入渐出效果的值
sm.setFadeDegree(0.35f);
// 设置触摸屏幕的模式
sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}
}

(5)LeftBottomFragment.java

Key:在菜单Fragment中定义回调函数  将Fragment的信息传递到Activity

package com.pps.myrenren.activity;

import java.util.ArrayList;
import java.util.List; import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; import com.pps.myrenren.adapter.CommonOrMoreAdapter;
import com.pps.myrenren.adapter.SettingAdapter;
import com.pps.myrenren.model.ItemComOrMoreModel;
import com.pps.myrenren.model.ItemSettingModel; public class LeftBottomFragment extends Fragment{
private View mView;
private Context mContext; private ListView listview_common;
private ListView listview_more;
private ListView listview_setting; private List<ItemComOrMoreModel> commonModels; //经常使用列表的Item集合
private List<ItemComOrMoreModel> moreModels; //很多其它列表的item集合
private List<ItemSettingModel> settingModels; //设置列表的item集合 private SLMenuListOnItemClickListener mCallbacks;//0628 //Key:
public void onAttach(Activity activity){
super.onAttach(activity);
//假设该Acitivity没有实现Callbacks接口
if(!(activity instanceof SLMenuListOnItemClickListener)){
try {
throw new Exception("LeftBottomFragment所在的Activity" +
"必须实现Callbacks接口");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//定义回调函数的接口对象的实例化---
//把该Activity当成Callbacks对象
mCallbacks = (SLMenuListOnItemClickListener) activity;
} public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { if (null == mView) {
mView = inflater.inflate(R.layout.fragment_left_bottom, container,
false);
initView();
initValidata();
bindData();
initialClickListener();
//
}
return mView;
}
/**
* 初始化界面元素
*/
private void initView() {
//---mView.findViewById() not .findViewById()
listview_common = (ListView) mView.findViewById(R.id.listview_common); listview_more = (ListView) mView.findViewById(R.id.listview_more);
listview_setting = (ListView) mView.findViewById(R.id.listview_setting); }
/**
* 初始化变量
*/
private void initValidata() {
mContext = mView.getContext();
commonModels=new ArrayList<ItemComOrMoreModel>();
moreModels=new ArrayList<ItemComOrMoreModel>();
settingModels=new ArrayList<ItemSettingModel>();
//1:进行构造经常使用列表中的数据,图标,名称,数量
Integer[] common_icon_id = new Integer[] {
R.drawable.v5_2_1_desktop_list_newsfeed,
R.drawable.v5_2_1_desktop_list_message,
R.drawable.v5_2_1_desktop_list_chat,
R.drawable.v5_2_1_desktop_list_friends,
R.drawable.v5_2_1_desktop_list_search,
R.drawable.v5_9_3_desktop_list_barcode };
String[] arrays_commom=mContext.getResources().getStringArray(R.array.arrays_commom);
int[] common_number=new int[]{0,1,2,3,4,1};
for(int i=0;i<common_icon_id.length;i++)
{
ItemComOrMoreModel commcon=new ItemComOrMoreModel(common_icon_id[i], arrays_commom[i], common_number[i]);
commonModels.add(commcon);
} //2:进行构造很多其它列表中的数据,图标,名称,数量
Integer[] more_icon_id=new Integer[]
{R.drawable.v5_2_1_desktop_list_location,R.drawable.v5_2_1_desktop_list_page,R.drawable.v5_2_0_desktop_list_hot,R.drawable.v5_2_1_desktop_list_apps_center};
String[] arrays_more=mContext.getResources().getStringArray(R.array.arrays_more);
int[] more_number=new int[]{0,0,0,0};
for(int i=0;i<more_icon_id.length;i++)
{
ItemComOrMoreModel more=new ItemComOrMoreModel(more_icon_id[i],arrays_more[i],more_number[i]);
moreModels.add(more);
} //3:进行构造设置列表中的数据,图标,名称
Integer[] setting_icon_id=new Integer[]{R.drawable.v_5_8day_mode_unselected,R.drawable.v5_2_1_desktop_list_settings,R.drawable.v5_2_1_desktop_list_log_out};
String[] arrays_setting=mContext.getResources().getStringArray(R.array.arrays_setting);
for(int i=0;i<setting_icon_id.length;i++)
{
ItemSettingModel setting=new ItemSettingModel(setting_icon_id[i],arrays_setting[i]);
settingModels.add(setting);
}
} /**
* 绑定数据
*/
private void bindData() {
//创建适配器而且进行绑定数据到listview中
listview_common.setAdapter(new CommonOrMoreAdapter(mContext, commonModels));
listview_more.setAdapter(new CommonOrMoreAdapter(mContext, moreModels));
listview_setting.setAdapter(new SettingAdapter(mContext, settingModels));
} //0628:点击滑动菜单子选项的回调接口
public interface SLMenuListOnItemClickListener{ public void selectItem(int position,String title);
} /*菜单选项单击响应事件的监听函数*/
public void initialClickListener(){ //
listview_common.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<? > parent, View view, int position,
long id) {
//激发mCallbacks的selectItem方法
mCallbacks.selectItem(position, commonModels.get(position).getName());
}
}); listview_more.setOnItemClickListener(new OnItemClickListener(){ @Override
public void onItemClick(AdapterView<? > parent, View view, int position,
long id) {
mCallbacks.selectItem(position, moreModels.get(position).getName()); }
}); listview_setting.setOnItemClickListener(new OnItemClickListener(){ @Override
public void onItemClick(AdapterView<? > parent, View view, int position,
long id) {
// TODO Auto-generated method stub
mCallbacks.selectItem(position, settingModels.get(position).getName());
} }); } }

(6)其它文件  省略

Eoeclient源代码分析---SlidingMenu的使用的更多相关文章

  1. android-plugmgr源代码分析

    android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...

  2. Twitter Storm源代码分析之ZooKeeper中的目录结构

    徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...

  3. 转:SDL2源代码分析

    1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...

  4. 转:RTMPDump源代码分析

    0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...

  5. 转:ffdshow 源代码分析

    ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...

  6. UiAutomator源代码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...

  7. MyBatis架构设计及源代码分析系列(一):MyBatis架构

    如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...

  8. hostapd源代码分析(三):管理帧的收发和处理

    hostapd源代码分析(三):管理帧的收发和处理 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004379 这篇文章我来讲解一下h ...

  9. hostapd源代码分析(二):hostapd的工作机制

    [转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一 ...

随机推荐

  1. 使用 Rails Webpacker 安裝 Foundation 6

    動機 由於 foundation-rails 6.4.1 版本有個 Issue 目前還沒合併.加上 Rails 已經支援了 webpack 2.x.這篇文章純粹紀錄另外一種做法. 準備 開始使用之前需 ...

  2. Django底层原理简介与安装

    Django环境目录搭建一栏: 利用wsgiref模块封装好的socket搭建服务端: #利用wsgiref模块封装好的socket演示操作(例如accept\recv) #也可以实现socket服务 ...

  3. PDO 使用prepared statement 预处理LIMIT等非表字段参数

    由于一些驱动不支持原生的预处理语句,因此PDO可以完全模拟预处理.PDO的模拟预处理是默认打开的,即便MYSQL驱动本身支持预处理,在默认打开的状态下,PDO是不会用到MYSQL本身提供的预处理功能. ...

  4. STL之map容器的详解

    一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据 ...

  5. HDU——1395 2^x mod n = 1(取模运算法则)

    2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. [luoguP2463] [SDOI2008]Sandy的卡片(后缀数组 + st表)

    传送门 很容易想到,题目中的相同是指差分数组相同. 那么可以把差分数组连起来,中间加上一个没有出现过的且字典序小的数 双指针移动,用st表维护height数组中的最小值. 当然用单调队列应该也可以且更 ...

  7. Python Base Two

    //fourth day to study python 24. In python , how to create funcation. we can use def to define funca ...

  8. Tomcat和JVM的性能调优总结

    Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...

  9. foj 2144 三位几何+区间覆盖

    题目大意:一个人站在三维坐标系下的原点处用炮打蚊子,给出n个蚊子的起始坐标跟单位时间匀速移动的方向向量,距离他R以内的蚊子都可以打到,不过他也需要休息,没蚊子的时候也可以休息下.求他要起来多少次打蚊子 ...

  10. Quotes in shell(bash, csh)

    There are three kinds of quote: single quote('), double quote("), backslash(\), how shell expla ...