当前位置: 首页 > news >正文

java和android架构公众号_Android仿微信公众号界面

最近在做一个关于微信公众平台服务号的小项目,主要用来实现排队叫号功能。一直都对微信公众号开发比较好奇,于是趁这次机会仔细研究了一下公众号的开发流程和逻辑架构。

微信公众平台现在分为3类:订阅号,服务号和企业号。其中,服务号和企业号的开放权限比较高,可以实现自定义菜单功能,调用摄像头以及LBS等API。

基本通信架构如图:

144d6266b794221d4298255ce7e977f6.png

在项目的功能设计阶段本想搭建一个服务号Demo用来展示,但微信服务号的认证手续太麻烦,而且我也没有那个资质去开通服务号。于是打算自己做一个仿微信公众号的基本界面,先实现菜单功能,避免开发初期的公众号注册,同时也方便展示。

先上效果图:

685b0f267b0a07c207dcb823d49ec413.png 

3681b204d5568f0fe5a31c857c32eead.png 

3108dd3653fc067b8626f0a134d5f749.png

1. 界面布局

主界面布局四部分,由上到下依次是:标题栏,消息列表,底部菜弹出的子菜单,底部菜单或输入栏。

主界面基本框架main.xml代码如下:

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#E4E4E4" >

android:id="@+id/lv"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_marginBottom="50dp"

android:layout_marginTop="10dp"

android:cacheColorHint="#00000000"

android:divider="#00000000"

android:dividerHeight="20dp"

android:scrollbars="none" >

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_gravity="bottom"

android:layout_marginBottom="50dp"

android:orientation="horizontal" >

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="0.5" />

android:id="@+id/pop_layout1"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_gravity="bottom"

android:layout_weight="1"

android:orientation="vertical" >

android:id="@+id/pop_layout2"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_gravity="bottom"

android:layout_weight="1"

android:orientation="vertical" >

android:id="@+id/pop_layout3"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_gravity="bottom"

android:layout_weight="1"

android:orientation="vertical" >

android:id="@+id/bottom_layout"

android:layout_width="fill_parent"

android:layout_height="50dp"

android:layout_gravity="bottom"

android:background="#00ffffff"

android:orientation="vertical" >

android:id="@+id/bottom_menu_layout1"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#ffffff"

android:orientation="vertical" >

android:layout_width="fill_parent"

android:layout_height="1px"

android:background="#A6A6A6" />

android:id="@+id/menu_layout"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:gravity="center"

android:orientation="horizontal" >

android:id="@+id/keyboard"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginBottom="5dp"

android:layout_marginLeft="3dp"

android:layout_marginRight="3dp"

android:layout_marginTop="5dp"

android:layout_weight="0.5"

android:background="@drawable/keyboard" />

android:layout_width="1px"

android:layout_height="fill_parent"

android:background="#A6A6A6" />

android:id="@+id/btn1"

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="1"

android:background="@drawable/btn_selector" >

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_margin="5dp" >

android:id="@+id/text1"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_centerInParent="true"

android:gravity="center"

android:text="用户绑定"

android:textColor="#000000"

android:textSize="16sp" />

android:layout_width="10dp"

android:layout_height="10dp"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:src="@drawable/more_icon"

android:visibility="invisible" />

android:layout_width="1px"

android:layout_height="fill_parent"

android:background="#A6A6A6" />

android:id="@+id/btn2"

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="1"

android:background="@drawable/btn_selector" >

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_margin="5dp" >

android:id="@+id/text2"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_centerInParent="true"

android:gravity="center"

android:text="扫描签到"

android:textColor="#000000"

android:textSize="16sp" />

android:layout_width="10dp"

android:layout_height="10dp"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:src="@drawable/more_icon"

android:visibility="invisible" />

android:layout_width="1px"

android:layout_height="fill_parent"

android:background="#A6A6A6" />

android:id="@+id/btn3"

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="1"

android:background="@drawable/btn_selector" >

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_margin="5dp" >

android:id="@+id/text3"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_centerInParent="true"

android:gravity="center"

android:text="更多"

android:textColor="#000000"

android:textSize="16sp" />

android:layout_width="10dp"

android:layout_height="10dp"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:src="@drawable/more_icon"

android:visibility="visible" />

标题栏title_bar.xml布局如下:

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="horizontal" >

android:id="@+id/title_bar_back_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_centerVertical="true"

android:layout_marginLeft="10dip"

android:src="@drawable/back" />

android:id="@+id/my_setting_title_tv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:text="腾讯招聘面试服务"

android:textColor="#ffffff"

android:textSize="20sp" />

android:id="@+id/title_bar_my"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_centerVertical="true"

android:layout_marginRight="10dip"

android:src="@drawable/my" />

完成title_bar布局后,再在values\styles.xml添加自定义标题栏主题

#32394A

45dp

@style/CustomWindowTitleBackground

消息列表的服务端消息item布局item_left.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal" >

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="4" >

android:id="@+id/server_image"

android:layout_width="40dp"

android:layout_height="40dp"

android:layout_marginLeft="2dp"

android:background="@drawable/qq"/>

android:id="@+id/server_text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="2dp"

android:layout_toRightOf="@id/server_image"

android:background="@drawable/text_bg_left1"

android:gravity="center_vertical|left"

android:textSize="16sp"

android:textColor="#000000"/>

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="1" />

消息列表的用户消息item布局item_right.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal" >

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="1" />

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="4" >

android:id="@+id/user_image"

android:layout_width="40dp"

android:layout_height="40dp"

android:layout_alignParentRight="true"

android:layout_marginRight="2dp"

android:background="@drawable/qq" />

android:id="@+id/user_text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginRight="1dp"

android:layout_toLeftOf="@id/user_image"

android:background="@drawable/text_bg_right1"

android:gravity="center_vertical|right"

android:textColor="#000000"

android:textSize="16sp" />

弹出的子菜单布局child_menu.xml如下:

android:id="@+id/child_layout"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="#FFFFFF"

android:gravity="bottom"

android:orientation="vertical" >

android:layout_width="wrap_content"

android:layout_height="wrap_content" >

android:id="@+id/test1"

android:layout_width="wrap_content"

android:layout_height="45dp"

android:background="@drawable/btn_selector"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:text="进度查询"

android:textColor="#000000"

android:textSize="16sp" />

android:layout_width="wrap_content"

android:layout_height="1px"

android:layout_alignLeft="@id/test1"

android:layout_alignRight="@id/test1"

android:layout_below="@id/test1"

android:background="#E4E4E4" />

android:layout_width="wrap_content"

android:layout_height="wrap_content" >

android:id="@+id/test1"

android:layout_width="wrap_content"

android:layout_height="45dp"

android:background="@drawable/btn_selector"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:text="使用帮助"

android:textColor="#000000"

android:textSize="16sp" />

android:layout_width="wrap_content"

android:layout_height="1px"

android:layout_alignLeft="@id/test1"

android:layout_alignRight="@id/test1"

android:layout_below="@id/test1"

android:background="#E4E4E4" />

android:layout_width="wrap_content"

android:layout_height="wrap_content" >

android:id="@+id/test1"

android:layout_width="wrap_content"

android:layout_height="45dp"

android:background="@drawable/btn_selector"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:text="联系我们"

android:textColor="#000000"

android:textSize="16sp" />

android:layout_width="wrap_content"

android:layout_height="1px"

android:layout_alignLeft="@id/test1"

android:layout_alignRight="@id/test1"

android:layout_below="@id/test1"

android:background="#E4E4E4" />

由底部菜单切换到输入框,输入框bottom_menu_layout2.xml布局如下:

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/bottom_menu_layout2"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#ffffff"

android:orientation="vertical" >

android:layout_width="fill_parent"

android:layout_height="1px"

android:background="#A6A6A6" />

android:id="@+id/menu_layout"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:gravity="center"

android:orientation="horizontal" >

android:id="@+id/menu"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginBottom="5dp"

android:layout_marginLeft="3dp"

android:layout_marginRight="3dp"

android:layout_marginTop="5dp"

android:layout_weight="0.5"

android:background="@drawable/menu" />

android:layout_width="1px"

android:layout_height="fill_parent"

android:background="#A6A6A6" />

android:id="@+id/btn1"

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_margin="5dp"

android:layout_weight="3"

android:background="#ffffff" >

android:id="@+id/voice"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_centerInParent="true"

android:layout_marginLeft="5dp"

android:src="@drawable/voice" />

android:id="@+id/add"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_centerInParent="true"

android:layout_marginRight="1dp"

android:background="@drawable/add"

android:paddingBottom="5dp"

android:paddingLeft="8dp"

android:paddingRight="8dp"

android:paddingTop="5dp"

android:text=""

android:textColor="#ffffff"

android:textSize="14sp" />

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:layout_marginLeft="5dp"

android:layout_marginRight="5dp"

android:layout_toLeftOf="@id/add"

android:layout_toRightOf="@id/voice" >

android:id="@+id/input_text"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:background="#00000000"

android:gravity="bottom"

android:paddingLeft="2dp"

android:paddingRight="2dp"

android:text=""

android:textColor="#000000"

android:textSize="16sp" />

android:layout_width="fill_parent"

android:layout_height="1px"

android:layout_below="@id/input_text"

android:layout_marginTop="10dp"

android:background="#A6A6A6" />

2. 代码实现

MainActivity.java

package com.example.wxdemo;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.os.Bundle;

import android.app.Activity;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnFocusChangeListener;

import android.view.ViewGroup;

import android.view.Window;

import android.view.animation.Animation;

import android.view.animation.AnimationUtils;

import android.widget.BaseAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.RelativeLayout;

import android.widget.TextView;

public class MainActivity extends Activity implements View.OnClickListener {

private LinearLayout bottomLayout;// 底部菜单父框架

private LinearLayout bottomMenuLayout1;// 底部菜单布局

private LinearLayout bottomMenuLayout2;// 底部输入框布局

private RelativeLayout btn1;// “用户绑定”按钮布局

private RelativeLayout btn2;// “扫描签到”按钮布局

private RelativeLayout btn3;// “更多”按钮布局

private LinearLayout popLayout1;

private LinearLayout popLayout2;

private LinearLayout popLayout3;// 弹出的子菜单父框架布局

private LinearLayout childLayout;// “更多”按钮的子菜单

private ListView lv;

private MyAdapter adapter;

private List> listData = new ArrayList>();

private ImageView keyboard;// 底部键盘切换图标

private ImageView menu;// 底部菜单切换图标

private Button send;// 发送按钮

private EditText inputText;// 输入框

private boolean open = true;// 子菜单填充状态标记

private boolean flag = false;// 子菜单显示状态标记

private boolean bind = false;// 用户绑定状态标记

private Animation animEnter;// 底部菜单进入动画

private Animation animExit;// 底部菜单退出动画

private View view;

private View view2;

private LayoutInflater inflater;

private int myID = 0;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

setContentView(R.layout.main);

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,

R.layout.title_bar);// 自定义标题栏

inflater = MainActivity.this.getLayoutInflater();

popLayout1 = (LinearLayout) findViewById(R.id.pop_layout1);

popLayout2 = (LinearLayout) findViewById(R.id.pop_layout2);

popLayout3 = (LinearLayout) findViewById(R.id.pop_layout3);

bottomLayout = (LinearLayout) findViewById(R.id.bottom_layout);

bottomMenuLayout1 = (LinearLayout) findViewById(R.id.bottom_menu_layout1);

keyboard = (ImageView) findViewById(R.id.keyboard);

btn1 = (RelativeLayout) findViewById(R.id.btn1);

btn2 = (RelativeLayout) findViewById(R.id.btn2);

btn3 = (RelativeLayout) findViewById(R.id.btn3);

lv = (ListView) findViewById(R.id.lv);

btn1.setOnClickListener(this);

btn2.setOnClickListener(this);

btn3.setOnClickListener(this);

keyboard.setOnClickListener(this);

adapter = new MyAdapter(this, listData);

lv.setAdapter(adapter);

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

int id = v.getId();

switch (id) {

case R.id.btn1:

btn1Click();

break;

case R.id.btn2:

break;

case R.id.btn3:

btn3Click();

break;

case R.id.keyboard:

keyboardClick();

break;

case R.id.menu:

menuClick();

break;

case R.id.add:

sendClick();

break;

default:

break;

}

}

public void btn1Click() {// 用户绑定

Map map = new HashMap();

map.put("type", "0");

if (!bind) {

map.put("text", "请输入您的手机号或简历ID进行帐号绑定,绑定成功后才能进行签到。");

} else {

map.put("text", "帐号已绑定成功,请您准时签到。");

}

listData.add(map);

adapter.notifyDataSetChanged();

}

public void btn2Click() {// 扫描签到

// TODO

}

public void btn3Click() {// 更多

if (open == true) {

view = inflater.inflate(R.layout.child_menu, popLayout3, true);

childLayout = (LinearLayout) view.findViewById(R.id.child_layout);

open = false;

}

if (flag == false) {

flag = true;

childLayout.setVisibility(View.VISIBLE);

} else {

flag = false;

childLayout.setVisibility(View.GONE);

}

}

public void keyboardClick() {//点击键盘按钮,由底部菜单切换为底部输入

view2 = inflater.inflate(R.layout.bottom_menu_layout2, bottomLayout,

true);

bottomMenuLayout2 = (LinearLayout) view2

.findViewById(R.id.bottom_menu_layout2);

animEnter = AnimationUtils.loadAnimation(MainActivity.this,

R.anim.my_pop_enter_anim);

animExit = AnimationUtils.loadAnimation(MainActivity.this,

R.anim.my_pop_exit_anim);

animEnter.setStartOffset(200);

bottomMenuLayout1.startAnimation(animExit);

bottomMenuLayout1.setVisibility(View.GONE);

bottomMenuLayout2.startAnimation(animEnter);

bottomMenuLayout2.setVisibility(View.VISIBLE);

menu = (ImageView) view2.findViewById(R.id.menu);

inputText = (EditText) view2.findViewById(R.id.input_text);

send = (Button) view2.findViewById(R.id.add);

menu.setOnClickListener(this);

send.setOnClickListener(this);

inputClick();

}

public void menuClick() {//点击菜单按钮,由底部输入框切换为底部菜单

bottomMenuLayout2.startAnimation(animExit);

bottomMenuLayout2.setVisibility(View.GONE);

bottomMenuLayout1.startAnimation(animEnter);

bottomMenuLayout1.setVisibility(View.VISIBLE);

}

public void inputClick() {

inputText.setOnFocusChangeListener(new OnFocusChangeListener() {

@Override

public void onFocusChange(View v, boolean hasFocus) {

// TODO Auto-generated method stub

if (hasFocus) {

send.setBackgroundResource(R.drawable.send_btn_bg);

send.setText("发送");

} else {

send.setBackgroundResource(R.drawable.add);

send.setText(" ");

}

}

});

}

public void sendClick() {

String text = inputText.getEditableText().toString();

inputText.setText("");

if (text != null && (!text.equals(""))) {

Map map;

map = new HashMap();

map.put("type", "1");// 消息类型,服务端为0,用户为1

map.put("text", text);

listData.add(map);

map = new HashMap();

map.put("type", "0");

map.put("text", "帐号已绑定成功,请您准时签到。");

listData.add(map);

adapter.notifyDataSetChanged();

bind = true;

}

}

private class MyAdapter extends BaseAdapter {

public List> list;

private Context context;

private int type;

private ListView listView;

public MyAdapter(Context context, List> list) {

this.context = context;

this.list = list;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return list.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return list.get(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

ViewHolder viewHolder = null;

Map map = (Map) list.get(position);

if (map.get("type").equals("0")) {// 服务端

if (convertView == null) {

convertView = inflater.inflate(R.layout.item_left, parent,

false);

viewHolder = new ViewHolder();

viewHolder.mTextView = (TextView) convertView

.findViewById(R.id.server_text);

viewHolder.mImageView = (ImageView) convertView

.findViewById(R.id.server_image);

convertView.setTag(viewHolder);

} else {

viewHolder = (ViewHolder) convertView.getTag();

}

viewHolder.mTextView.setText(map.get("text"));

} else {// 用户

if (convertView == null) {

convertView = inflater.inflate(R.layout.item_right, parent,

false);

viewHolder = new ViewHolder();

viewHolder.mTextView = (TextView) convertView

.findViewById(R.id.user_text);

viewHolder.mImageView = (ImageView) convertView

.findViewById(R.id.user_image);

convertView.setTag(viewHolder);

} else {

viewHolder = (ViewHolder) convertView.getTag();

}

viewHolder.mTextView.setText(map.get("text"));

}

return convertView;

}

}

private final class ViewHolder {

TextView mTextView;

ImageView mImageView;

}

}

以上就是实现仿微信服务号的主要代码,菜单功能并没用完全实现,可根据实际情况和需要进行添加。同时还需注意的是,底部菜单最多为3个,每个名称限制在7个字符,包含的子菜单最多只能有5个。

相关文章:

  • 连连看的连线怎么写java_求助 这个连连看的方法地方该怎么写
  • php java字节流_php中stream(流)的用法
  • java自动雨刷系统_【图文】汽车自动雨刷的使用指南
  • php 多线程处理_PHP CURL 多线程操作代码实例
  • php定义函数打印表格内容,php 自定义函数实现将数据 以excel 表格形式导出示例...
  • nodejs与php混合,php与nodejs的加密数据互通
  • php参数特殊字符,PHP中URL中特殊字符引起的问题(+,=) 分析及解决方法
  • php 鼠标点击其他区域下拉框隐藏,jQuery除指定区域外点击任何地方隐藏DIV功能...
  • java 日期转换星期,关于JAVA的小工具(日期转周几)
  • PHP的经典程序,几款经典php分页程序(1/4)
  • java gzip加解秘,vue 基于pako.js实现gzip的压缩和解压功能
  • matlab每一行白点个数,MATLAB 简单的计算白色轮廓中像素点的个数
  • java 类共享变量,Java提供了ThreadLocal(java.lang)类,实现线程内共享变量
  • Java第三方语音包发声,JDK中的包和他们的基本功能
  • python mock数据,python学习开发mock接口
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 10个确保微服务与容器安全的最佳实践
  • IDEA常用插件整理
  • vagrant 添加本地 box 安装 laravel homestead
  • vue 配置sass、scss全局变量
  • 从0实现一个tiny react(三)生命周期
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 设计模式 开闭原则
  • 树莓派 - 使用须知
  • 数据仓库的几种建模方法
  • 因为阿里,他们成了“杭漂”
  • ​如何防止网络攻击?
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (转)c++ std::pair 与 std::make
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net IE10 _doPostBack 未定义
  • .net web项目 调用webService
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET企业级应用架构设计系列之开场白
  • .sh 的运行
  • @AutoConfigurationPackage的使用
  • @Bean, @Component, @Configuration简析
  • @GetMapping和@RequestMapping的区别
  • @JsonFormat与@DateTimeFormat注解的使用
  • @SuppressWarnings(unchecked)代码的作用
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [100天算法】-实现 strStr()(day 52)
  • [ARM]ldr 和 adr 伪指令的区别
  • [BROADCASTING]tensor的扩散机制
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [HackMyVM]靶场 Wild
  • [iOS]-网络请求总结
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • [No000016]为什么假期计划总是做不到?
  • [php] 数据结构算法(PHP描述) 快速排序 quick sort