Android——基本控件(下)(十九)

1. 菜单:Menu

1.1 知识点

(1)掌握Android中菜单的使用;

(2)掌握选项菜单(OptionsMenu)的使用;

(3)掌握上下文菜单(ContextMenu)的使用;

(4)掌握子菜单(SubMenu)的使用;

1.2 具体内容

 

 

package com.example.menuproject;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MenuActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_menu);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(Menu.NONE,//菜单不分组
				Menu.FIRST+1,//菜单项的id
				1,//菜单的编号
				"添加")//菜单标题
		        .setIcon(//设置菜单图标
		        R.drawable.add);
		menu.add(Menu.NONE,Menu.FIRST+2,2,"保存").setIcon(R.drawable.save);
		menu.add(Menu.NONE,Menu.FIRST+3,3,"编辑").setIcon(R.drawable.edit);
		menu.add(Menu.NONE,Menu.FIRST+4,4,"详细").setIcon(R.drawable.detail);
		menu.add(Menu.NONE,Menu.FIRST+5,5,"删除").setIcon(R.drawable.delete);
		menu.add(Menu.NONE,Menu.FIRST+6,6,"更多").setIcon(R.drawable.more);
		return true;
	}

}

 只需要在onCreateOptionsMenu(Menu menu)去进行菜单的设置就行

@Override
	public boolean onPrepareOptionsMenu(Menu menu){
		Toast.makeText(this, "菜单显示前操作", 0).show();
		return true;
	}

以上是在菜单显示之前执行的一个方法,可以从父类当中去覆写以便实现一些逻辑

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

以上实在菜单关闭之后执行的一个方法。

@Override
	public boolean onOptionsItemSelected(MenuItem item){
		switch (item.getItemId()){
		case Menu.FIRST+1:
			Toast.makeText(this, "这是添加菜单项", 0).show();
		    break;
		case Menu.FIRST+2:
			Toast.makeText(this, "这是保存菜单项", 0).show();
		    break;
		case Menu.FIRST+3:
			Toast.makeText(this, "这是编辑菜单项", 0).show();
		    break;
		case Menu.FIRST+4:
			Toast.makeText(this, "这是详情菜单项", 0).show();
		    break;
		case Menu.FIRST+5:
			Toast.makeText(this, "这是删除菜单项", 0).show();
		    break;
		case Menu.FIRST+6:
			Toast.makeText(this, "这是更多菜单项", 0).show();
		    break;
		}
		return false;
	}

以上都是在Activity当中去添加菜单选项。

当然也可以在xml文件中添加菜单选项。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/m1"
        android:orderInCategory="100"
        android:title="添加"/>
    <item
        android:id="@+id/m2"
        android:orderInCategory="101"
        android:title="保存"/>
    <item
        android:id="@+id/m3"
        android:orderInCategory="102"
        android:title="编辑"/>
    <item
        android:id="@+id/m4"
        android:orderInCategory="103"
        android:title="详情"/>
    <item
        android:id="@+id/m5"
        android:orderInCategory="104"
        android:title="删除"/>
    <item
        android:id="@+id/m6"
        android:orderInCategory="105"
        android:title="更多"/>
    

</menu>

此处需要注意的是,加载的xml文件不是layout文件而是menu文件

@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.getMenuInflater().inflate(R.menu.menu, menu);
		return true;
	}
	

上下文菜单

package com.example.menuproject;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MenuActivity extends Activity {
    String data[] ={"中国高校培训","培训课程","万策智业"};
    ListView listView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.listView = new ListView(this);
		listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,this.data));
		super.registerForContextMenu(listView);//注册上下文菜单
		super.setContentView(listView);
	}

	@Override
	public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		menu.setHeaderTitle("信息操作");
		menu.add(Menu.NONE,Menu.FIRST+1,1,"添加联系人");
		menu.add(Menu.NONE,Menu.FIRST+2,2,"查看详情");
		menu.add(Menu.NONE,Menu.FIRST+3,3,"删除信息");
		menu.add(Menu.NONE,Menu.FIRST+4,4,"编辑");
	}
	
	
}

 以上是实现上下文菜单组件

@Override
	public boolean onContextItemSelected(MenuItem item){
		switch (item.getItemId()){
		case Menu.FIRST+1:
			Toast.makeText(this, "添加联系人", 0).show();
		    break;
		case Menu.FIRST+2:
			Toast.makeText(this, "查看详情", 0).show();
		    break;
		case Menu.FIRST+3:
			Toast.makeText(this, "删除信息", 0).show();
		    break;
		case Menu.FIRST+4:
			Toast.makeText(this, "编辑", 0).show();
		    break;
	
		}
		return false;
	}

子菜单:SubMenu

@Override
	public boolean onCreateOptionsMenu(Menu menu){
		SubMenu fileMenu = menu.addSubMenu("文件");
		SubMenu editMenu = menu.addSubMenu("编辑");
		
		fileMenu.add(Menu.NONE,Menu.FIRST+1,1,"新建");
		fileMenu.add(Menu.NONE,Menu.FIRST+2,2,"打开");
		editMenu.add(Menu.NONE,Menu.FIRST+3,3,"保存");
		editMenu.add(Menu.NONE,Menu.FIRST+4,4,"撤销");
		return true;
	}

 子菜单的监听

@Override
	public boolean onOptionsItemSelected(MenuItem item){
		switch (item.getItemId()){
		case Menu.FIRST+1:
			Toast.makeText(this, "新建子菜单", 0).show();
		    break;
		case Menu.FIRST+2:
			Toast.makeText(this, "打开子菜单", 0).show();
		    break;
		case Menu.FIRST+3:
			Toast.makeText(this, "保存子菜单", 0).show();
		    break;
		case Menu.FIRST+4:
			Toast.makeText(this, "撤销子菜单", 0).show();
		    break;
	    }
		return false;
	}

1.3 小结

(1)界面开发之中使用菜单可以有效的对工具集进行管理;

(2)Android中一共分为三种菜单:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)。

2. 隐式抽屉组件:SlidingDrawer

2.1 知识点

(1)掌握SlidingDrawer 的主要作用及实现;

(2)掌握SlidingDrawer 组件的事件处理方式;

2.2 具体内容

 

 

<LinearLayout xmlns: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:orientation="vertical"
    tools:context=".SlidingDrawerActivity" >

    <SlidingDrawer 
        android:id="@+id/sd"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:handle="@+id/img"
        android:content="@+id/content"
        >
        <ImageView 
            android:id="@+id/img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/pic_8"
            />
        <LinearLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >
        </LinearLayout> 
    </SlidingDrawer>
    
    
    
</LinearLayout>

定义一个内嵌LInearLayout,以便能够在后台动态添加程序集

package com.example.slidingdrawer;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SlidingDrawer;
import android.widget.SlidingDrawer.OnDrawerCloseListener;
import android.widget.SlidingDrawer.OnDrawerOpenListener;
import android.widget.SlidingDrawer.OnDrawerScrollListener;
import android.widget.Toast;

public class SlidingDrawerActivity extends Activity {
    String data[]={"兰州","定西","武威","张掖"};
    ListView listView = null;
    SlidingDrawer sd = null;
    ImageView img = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_sliding_drawer);
		LinearLayout content = (LinearLayout) super.findViewById(R.id.content);
		listView = new ListView(this);
		listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,data));
		content.addView(this.listView);
		sd = (SlidingDrawer) super.findViewById(R.id.sd);
		img = (ImageView) super.findViewById(R.id.img);
		sd.setOnDrawerOpenListener(new OnDrawerOpenListenerImpl());
		sd.setOnDrawerCloseListener(new OnDrawerCloseListenerImpl());
		sd.setOnDrawerScrollListener(new OnDrawerScrollListenerImpl());
		
	}

	private class OnDrawerOpenListenerImpl implements OnDrawerOpenListener{

		@Override
		public void onDrawerOpened() {
			img.setImageResource(R.drawable.pic_6);
		}
		
	}
	private class OnDrawerCloseListenerImpl implements OnDrawerCloseListener{

		@Override
		public void onDrawerClosed() {
			img.setImageResource(R.drawable.pic_8);
			
		}
		
	}
    private class OnDrawerScrollListenerImpl implements OnDrawerScrollListener{

		@Override
		public void onScrollEnded() {
          Toast.makeText(SlidingDrawerActivity.this, "窗口拖动结束", 0).show();
		}

		@Override
		public void onScrollStarted() {
			// TODO Auto-generated method stub
			Toast.makeText(SlidingDrawerActivity.this, "窗口拖动开始", 0).show();
		}}
}

2.3 小结

(1)使用SlidingDrawer 组件可以更好的管理按钮操作集。

3. 缩放控制:ZoomControls

3.1 知识点

(1)掌握ZoomControls组件的使用;

3.2 具体内容

实现利用缩放组件进行对字体大小缩放。

<LinearLayout xmlns: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:orientation="vertical"
    tools:context=".ZoomControlsActivity" >

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ZoomControls控件控制文字缩放" 
        android:textSize="10dp"
        />
    
    <ZoomControls 
        android:id="@+id/zoomcontrols"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="bottom"
        />

</LinearLayout>

 

package com.example.zoomcontrols;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.ZoomControls;

public class ZoomControlsActivity extends Activity {
    int size =10;
    TextView tv = null;
    ZoomControls zc =null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_zoom_controls);
		zc = (ZoomControls) super.findViewById(R.id.zoomcontrols);
		tv = (TextView) super.findViewById(R.id.tv);
		zc.setOnZoomInClickListener(new OnZoomInCLickListenerImpl());
		zc.setOnZoomOutClickListener(new OnZoomOutCLickListenerImpl());
	}
    //放大监听
    private class OnZoomInCLickListenerImpl implements OnClickListener{

		@Override
		public void onClick(View v) {
			ZoomControlsActivity.this.size += 2;
			ZoomControlsActivity.this.tv.setTextSize(size);
		}
    	
    	
    }
    //缩小监听
    private class OnZoomOutCLickListenerImpl implements OnClickListener{

		@Override
		public void onClick(View v) {
			ZoomControlsActivity.this.size -= 2;
			ZoomControlsActivity.this.tv.setTextSize(size);
		}
    	
    	
    }
}

3.3 小结

(1)ZoomControls组件可以由用户根据自己的需要控制显示的大小。

4. 弹出窗口:PopupWindow

4.1 知识点

(1)掌握弹出窗口的基本实现;

(2)掌握弹出窗口的事件处理操作;

4.2 具体内容

弹出窗口意味着在原有的手机上,增加一个专门的显示层,作为弹出窗口显示的空间。

 

既然PopupWindow组件是可以直接在界面上显示自己的一个界面层,那么就需要专门的一个布局管理器文件,来定PopupWindow组件。

<LinearLayout 
    xmlns: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:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请选择您所需要的状态" />
    <RadioGroup 
        android:id="@+id/checkStatus"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <RadioButton 
            android:id="@+id/onLine"
            android:layout_width="match_parent"
        	android:layout_height="wrap_content"
            android:text="在线"
            />
        <RadioButton 
            android:id="@+id/offLine"
            android:layout_width="match_parent"
        	android:layout_height="wrap_content"
            android:text="离线"
            />
        <RadioButton 
            android:id="@+id/steach"
            android:layout_width="match_parent"
        	android:layout_height="wrap_content"
            android:text="隐身"
            />
    </RadioGroup>
	<Button 
	    android:id="@+id/cancel"
	    android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="取消"
	    />
</LinearLayout>

以上的布局管理器就是一个作为PopupWindow的显示。

现在我们来定义我们主布局管理器。

<LinearLayout 
    xmlns: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:orientation="vertical" >
    <TextView
        android:id="@+id/statusInfo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="用户当前状态:在线" />
    <Button 
        android:id="@+id/popbut"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="选择状态"
        />

</LinearLayout>

以上就是主布局管理器,现在还有一个问题,现在是通过按钮事件去弹出PopupWindow,那么肯定需要一个转换器将需要显示的布局管理器设置到PopupWindow上。这时需要使用LayoutInflater进行转换。现在我们来编写Activity程序。

package com.example.popupwindowproject;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;
public class PopupWindowActivity extends Activity {
	private  Button statuBut = null;
	private TextView statuInfo = null;
	private RadioGroup checkStatu = null;
	private Button cancelBut = null;
	private PopupWindow popWin = null;
	private View popView = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_popup_window);
		this.statuBut = (Button) super.findViewById(R.id.popbut);
		this.statuInfo = (TextView) super.findViewById(R.id.statusInfo);
		this.statuBut.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				LayoutInflater inflater = LayoutInflater.from(PopupWindowActivity.this);
				PopupWindowActivity.this.popView = (View) inflater.inflate(R.layout.popup_window, null);//将布局文件转换成组件
				PopupWindowActivity.this.popWin = new PopupWindow(PopupWindowActivity.this.popView,300,220);//创建一个新的PopupWindow
				PopupWindowActivity.this.popWin.setContentView(PopupWindowActivity.this.popView);//设置显示组件
				PopupWindowActivity.this.checkStatu = (RadioGroup) PopupWindowActivity.this.popView.findViewById(R.id.checkStatus);
				PopupWindowActivity.this.cancelBut = (Button) PopupWindowActivity.this.popView.findViewById(R.id.cancel);
				PopupWindowActivity.this.checkStatu.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					@Override
					public void onCheckedChanged(RadioGroup group, int checkedId) {
						RadioButton rbut = (RadioButton) PopupWindowActivity.this.popView.findViewById(group.getCheckedRadioButtonId());//取得选中的组件ID
						PopupWindowActivity.this.statuInfo.setText("您选中的状态是:"+rbut.getText());//修改我们文本显示组件的内容
					}
				});
				PopupWindowActivity.this.cancelBut.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						PopupWindowActivity.this.popWin.dismiss();//隐藏PopupWindow
					}
				});
				PopupWindowActivity.this.popWin.showAtLocation(PopupWindowActivity.this.statuBut,Gravity.CENTER, 0, 0);//显示弹出窗口
			}
		});
	}
}

是要是组件就离不开布局文件,有个前提:就是组件中显示的内容会比较多。

4.3 小结

(1)弹出窗口需要一个单独的布局管理器进行配置;

(2)可以使用LayoutInflater通过配置文件读取组件信息;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/95363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

No message found under code ‘-1‘ for locale ‘zh_CN‘.

导出中的报错&#xff1a;No message found under code -1 for locale zh_CN. 报错原因&#xff1a;页面中展示的数据和后端excel中的数据不一致导致 具体原因&#xff1a;

14-数据结构-二叉树的创建以及前中后遍历,以及结点和叶子节点的计算(C语言)

概述&#xff1a; 二叉树&#xff0c;这里采用孩子链表存储法&#xff0c;即一个数据域和两个左右孩子指针域。随后递归进行遍历即可。在创建二叉树的时候&#xff0c;先创建各个二叉树结点&#xff08;这里的结点采用动态分配&#xff0c;因此结点为指针变量&#xff09;&…

为什么说计算机科学与计算机无关, 什么是真正的计算机科学?

什么是计算机科学呢? 我们可能很容易望文生义地理解为"不就是关于计算机的科学吗? "然而一位来自 MIT 计算机系的教授认为"计算机科学"不但不是科学, 而且而且还跟计算机无关!这是怎么回事呢? 视频链接见这里. 下面我们就来分享一下他对于计算机科学的看…

vue拖拽div盒子实现上下拖动互换

vue拖拽div盒子实现上下拖动互换 <div v-for"(item, index) in formList" :key"index" draggable"true"dragstart"handleDragStart($event, item)"dragenter"handleDragEnter($event, item)"dragover.prevent"han…

C语言_分支和循环语句(2)

文章目录 前言一、for 循环1.1语法1.2 for 语句的循环控制变量1.3 一些 for 循环的变种 二、do ... while()循环2.1 do 语句的语法2.2 do ... while 循环中的 break 和 continue2.3 练习1 **- 计算n的阶乘**2. - **在一个有序数组中查找具体的某个数字 n** 二分查找算法&#x…

matlab使用教程(28)—微分方程(ODE)求解常见问题

1.非负 ODE 解 本博客说明如何将 ODE 解约束为非负解。施加非负约束不一定总是可有可无&#xff0c;在某些情况下&#xff0c;由于方程的物理解释或解性质的原因&#xff0c;可能有必要施加非负约束。仅在必要时对解施加此约束&#xff0c;例如不这样做积分就会失败或者解将不…

华纳云:ubuntu下nginx服务器如何配置

在Ubuntu操作系统上配置Nginx服务器涉及以下步骤。这里我将提供一个基本的配置示例&#xff0c;你可以根据自己的需求进行修改和定制。 安装 Nginx&#xff1a; 打开终端&#xff0c;并输入以下命令来安装 Nginx&#xff1a; sudo apt update sudo apt install nginx 启动 …

SSL核心概念 SSL类型级别

SSL&#xff1a;SSL&#xff08;Secure Sockets Layer&#xff09;即安全套接层&#xff0c;及其继任者传输层安全&#xff08;Transport Layer Security&#xff0c;TLS&#xff09;是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。 H…

【Java基础增强】类加载器和反射

1.类加载器 1.1类加载器【理解】 作用 负责将.class文件&#xff08;存储的物理文件&#xff09;加载在到内存中 1.2类加载的过程【理解】 类加载时机 创建类的实例&#xff08;对象&#xff09; 调用类的类方法 访问类或者接口的类变量&#xff0c;或者为该类变量赋值 …

网页接口导入postman进行接口请求

postman版本&#xff1a;v10.17.4 一、拷贝接口信息 网页打开开发者工具-networkk&#xff0c;在网页上请求一次接口&#xff0c;鼠标指在接口上&#xff0c;点击鼠标右键-copy-copy as cURL(bash) 二、导入postman 打开postman&#xff0c;点击import-Raw text&#xff0c;…

【C语言】位操作符的一些题目与技巧

初学者在学完位操作符之后&#xff0c;总是不能很好的掌握&#xff0c;因此这篇文章旨在巩固对位操作符的理解与使用。 有的题目可能会比较难以接受&#xff0c;但是看完一定会有收获 目录 位操作符&#xff1a;一些题目&#xff1a;不创建临时变量交换整数整数转换二进制中1的…

Kotlin判断null比较let布尔值Boolean

Kotlin判断null比较let布尔值Boolean class MyData {val count: Int? 2023val number: Int? null }fun main(args: Array<String>) {val data MyData()val year 2022if (data.count ! null) {if (data.count > year) {println("data.count ! null")}}…

Linux内核数据结构 散列表

1、散列表数据结构 在Linux内核中&#xff0c;散列表&#xff08;哈希表&#xff09;使用非常广泛。本文将对其数据结构和核心函数进行分析。和散列表相关的数据结构有两个&#xff1a;hlist_head 和 hlist_node //hash桶的头结点 struct hlist_head {struct hlist_node *first…

App卡帧与BlockCanary

作者&#xff1a;图个喜庆 一&#xff0c;前言 app卡帧一直是性能优化的一个重要方面&#xff0c;虽然现在手机硬件性能越来越高&#xff0c;明显的卡帧现象越来越少&#xff0c;但是了解卡帧相关的知识还是非常有必要的。 本文分两部分从app卡帧的原理出发&#xff0c;讨论屏…

ElasticSearch总结

ES是什么 ES是一个天生支持分布式的搜索、聚合分析的存储引擎 基于Java开发 基于Lucene的开源分布式搜索引擎 ELK &#xff1a; elasticSearch Logstah Kibana 加入 Beats 后 ELK 改为 &#xff1a;Elastic stack ES解决了什么问题 ES解决的核心问题 &#xff1a; 1.海量数…

pinia——添加插件——基础积累

问题&#xff1a;是否给pinia添加过插件&#xff1f;具体添加的方式是什么&#xff1f; 在pinia中&#xff0c;我们可以为仓库添加插件&#xff0c;通过添加插件能够扩展以下的内容&#xff1a; 为 store 添加新的属性 定义 store 时增加新的选项 为 store 增加新的方法 包装现…

three.js(六):自适应设备分辨率

自适应设备分辨率 当今大多数的PC端和移动端显示器都是HD-DPI显示器。HD-DPI 是High Definition-Dots Per Inch 的简称&#xff0c;意思是高分辨率显示器。不同设备的显示器的分辨率是不一样的。 以上图中的iPhone6/7/8 为例&#xff1a;375*667 代表的手机的屏幕的物理尺寸&a…

本地套接字通信

1.本地套接字 本地套接字的作用&#xff1a;本地的进程间通信 有关系的进程间的通信 没有关系的进程间的通信 本地套接字实现流程和网络套接字类似&#xff0c;一般采用TCP的通信流程 2.本地套接字通信的流程 - tcp // 服务器端 1.创建监听的套接字int lfd socket(AF_U…

顺序表链表OJ题(3)——【数据结构】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a; 今天是链表顺序表OJ练习题最后一次分享&#xff0c;每一次的分享题目的难度也再有所提高&#xff0c;但是我相信大家都是非常机智的&#xff0c;希望看到博主文章能学到东西的可以一键三连关注一下博主…

数据库——Redis 单线程模型详解

文章目录 Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 &#xff08;Netty 的线程模型也基于 Reactor 模式&#xff0c;Reactor 模式不愧是高性能 IO 的基石&#xff09;&#xff0c;这套事件处理模型对应的是 Redis 中的文件事件处理器&#xff08;file …