UI界面编写(仿QQ聊天界面)

UI界面编写实战

这里我们模拟QQ聊天的主界面,编写一个简单的聊天界面。

项目描述

首先搭建我们的主界面,在最上边放一个标题栏,然后是一个ListView,用于展示发送的消息,最下边是选择要发送的表情,内容类型,一个发送框和一个发送按钮。
先写一个颜色的资源

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="light_blue">#18B4ED</color><color name="gray">#EBECEE</color><color name="white">#ffffff</color>
</resources>

然后就是主界面

<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=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:background="@color/light_blue"android:padding="15dp"><ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:src="@mipmap/jzw"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:textColor="@color/white"android:text="消息"/><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textSize="25sp"android:textColor="@color/white"android:gravity="center"android:text="模拟聊天"/><ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:src="@mipmap/login_icon01"/><ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:src="@mipmap/personal_normal"android:layout_marginLeft="10dp"/></LinearLayout><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="@drawable/chat_background"android:divider="#0000"></ListView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:background="@color/gray"android:layout_margin="10dp"android:gravity="center"><ImageViewandroid:id="@+id/biaoqing"android:layout_width="30dp"android:layout_height="30dp"android:src="@mipmap/eol"/><ImageViewandroid:id="@+id/choose"android:layout_width="30dp"android:layout_height="30dp"android:src="@mipmap/addcommodity"android:layout_marginLeft="10dp"/><EditTextandroid:id="@+id/edittext"android:layout_width="0dp"android:layout_height="30dp"android:layout_weight="1"android:background="@color/white"android:layout_marginLeft="10dp"/><Buttonandroid:id="@+id/send"android:layout_width="wrap_content"android:layout_height="30dp"android:text="发送"android:background="@drawable/button"android:layout_marginLeft="10dp"/></LinearLayout>
</LinearLayout>

然后是我们的drawable文件的内容:
为发送按钮写了一个shape:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="5dp"/><solid android:color="@color/light_blue"/>
</shape>

为展示消息的ListVeiw设置一个背景,也是用一个渐变色。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><gradientandroid:startColor="#ACE7EF"android:centerColor="#CAE0D9"android:endColor="#E7D9C5"android:angle="270"></gradient>
</shape>

为昵称前边的标签设置一个背景

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="15dp"/><solid android:color="#86D070"/><padding android:left="20dp" android:right="20dp"/>
</shape>

接着,因为我们要发送和接收消息,让接收的消息呈现在左边,发送的消息呈现在右边,所以要为两边各写一个消息的布局。
左边的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/time"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:padding="10dp"android:text="星期五  14:29" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/touxiang"android:layout_width="60dp"android:layout_height="60dp"android:src="@mipmap/weheartit" /><LinearLayoutandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/textbackground"android:text="营长"android:textColor="@color/white"android:textSize="15sp" /><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp"android:text="美女"android:layout_marginLeft="10dp"/></LinearLayout><TextViewandroid:id="@+id/message"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="60sp"android:layout_marginTop="10sp"android:background="@mipmap/eng"/></LinearLayout></LinearLayout>
</LinearLayout>

右边的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/time"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:padding="10dp"android:text="星期五  14:29" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><LinearLayoutandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="right"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="right"android:orientation="horizontal"><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp"android:text="美女"android:layout_marginLeft="10dp"/><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/textbackground"android:text="营长"android:textColor="@color/white"android:textSize="15sp" /></LinearLayout><TextViewandroid:id="@+id/message"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="60sp"android:layout_marginTop="10sp"android:background="@mipmap/qqright"/></LinearLayout><ImageViewandroid:id="@+id/touxiang"android:layout_width="60dp"android:layout_height="60dp"android:src="@mipmap/weheartit" /></LinearLayout>
</LinearLayout>

接着定义我们消息内容的实体类ChatMessage.java

/*** Created by Administrator on 2015/8/31.*/
public class ChatMessage {private int touxiang;//头像private String title;//标签private String name;//昵称private String message;//消息内容private long time;//发送时间private int type;//消息类型,即左边或者右边public ChatMessage(int touxiang, String title, String name, String message, long time) {this.touxiang = touxiang;this.title = title;this.name = name;this.message = message;this.time = time;}public int getType() {return type;}public void setType(int type) {this.type = type;}public int getTouxiang() {return touxiang;}public void setTouxiang(int touxiang) {this.touxiang = touxiang;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public long getTime() {return time;}public void setTime(long time) {this.time = time;}
}

定义我们消息内容的适配器MessageAdapter

import android.text.Html;
import android.text.Spanned;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;/*** Created by Administrator on 2015/8/31.*/
public class MessageAdapter extends BaseAdapter{private LayoutInflater inflater;private ArrayList<ChatMessage> data;private Html.ImageGetter getter;private static final int TYPE=2;public static final int MESSAGE_LEFT=0;public static final int MESSAGE_RIGHT=1;public MessageAdapter(LayoutInflater inflater, ArrayList<ChatMessage> data,Html.ImageGetter getter) {this.inflater = inflater;this.data = data;this.getter=getter;}@Overridepublic int getViewTypeCount() {//得到当前缓存布局类型的数量return TYPE;//因为有左右两种布局,返回常量2}@Overridepublic int getItemViewType(int position) {return data.get(position).getType();//返回当前布局的类型}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ChatMessage chatMessage=data.get(position);View view=null;ViewHolder viewHolder;int type=getItemViewType(position);if(convertView==null){switch (type){case MESSAGE_LEFT:view=inflater.inflate(R.layout.message,null);break;case MESSAGE_RIGHT:view=inflater.inflate(R.layout.message_right,null);break;default:break;}viewHolder=new ViewHolder();viewHolder.touxiang= (ImageView) view.findViewById(R.id.touxiang);viewHolder.title= (TextView) view.findViewById(R.id.title);viewHolder.name= (TextView) view.findViewById(R.id.name);viewHolder.message= (TextView) view.findViewById(R.id.message);viewHolder.time= (TextView) view.findViewById(R.id.time);view.setTag(viewHolder);}else {view=convertView;viewHolder= (ViewHolder) view.getTag();}viewHolder.touxiang.setImageResource(chatMessage.getTouxiang());viewHolder.title.setText(chatMessage.getTitle());viewHolder.name.setText(chatMessage.getName());Spanned spanned=Html.fromHtml(chatMessage.getMessage(),getter,null);viewHolder.message.setText(spanned);//因为内容可能添加表情,所以传入富文本SimpleDateFormat format= new SimpleDateFormat("EEE HH:mm");String time=format.format(new Date(chatMessage.getTime()));viewHolder.time.setText(time);//设置显示时间的格式return view;}class ViewHolder{ImageView touxiang;TextView title;TextView name;TextView message;TextView time;}
}

下面就要设置表情了,我们点击表情图片时,弹出一个PopupWindow,然后在里边设置一个GridView来显示我们的全部表情。
新建一个Gridview布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><GridViewandroid:id="@+id/expression"android:layout_width="match_parent"android:layout_height="match_parent"android:numColumns="4"></GridView>
</LinearLayout>

然后是表情的布局,就是一个ImageView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/image_expression"android:layout_width="wrap_content"android:layout_height="wrap_content" />
</LinearLayout>

然后我们定义表情的实体类Expression

/*** Created by Administrator on 2015/8/31.*/
public class Expression {private int image;//设置一张表情的图片public int getImage() {return image;}public void setImage(int image) {this.image = image;}
}

接着我们写一个表情的适配器ExpressionAdapter

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import java.util.ArrayList;/*** Created by Administrator on 2015/8/31.*/
public class ExpressionAdapter extends BaseAdapter {private LayoutInflater inflater;private ArrayList<Expression> expressions;public ExpressionAdapter(LayoutInflater inflater, ArrayList<Expression> expressions) {this.inflater = inflater;this.expressions = expressions;}@Overridepublic int getCount() {return expressions.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Expression expression=expressions.get(position);View view =inflater.inflate(R.layout.biaoqing,null);ImageView image= (ImageView) view.findViewById(R.id.image_expression);image.setImageResource(expression.getImage());return view;}
}

接下来呢,为了美观,当我们点击加号图片时,弹出一个PopupWindow,里边放置两个RadioButton,让我们选择发送信息的类型。
定义这个布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="horizontal"><RadioGroupandroid:id="@+id/radiogroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="receive"/><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="send"/></RadioGroup>
</LinearLayout>

最后就是我们主活动的代码了!

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import java.util.ArrayList;public class MainActivity extends Activity {private EditText editText;private ArrayList<ChatMessage> data;private MessageAdapter adapter;private Html.ImageGetter getter;private ListView listView;private LayoutInflater inflater;private GridView gridView;private ArrayList<Expression> expressions;private ExpressionAdapter expressionAdapter;private View view;private View chooseView;private ImageView imageView;private ImageView choose;private String name;private ChatMessage chatMessage;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText = (EditText) findViewById(R.id.edittext);imageView = (ImageView) findViewById(R.id.biaoqing);choose = (ImageView) findViewById(R.id.choose);Button send = (Button) findViewById(R.id.send);listView = (ListView) findViewById(R.id.listview);inflater = getLayoutInflater();view = inflater.inflate(R.layout.expression, null);chooseView = inflater.inflate(R.layout.sendreceive, null);data = new ArrayList<>();imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {PopupWindow popupWindow = new PopupWindow(MainActivity.this);popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);popupWindow.setContentView(view);popupWindow.setFocusable(true);popupWindow.setOutsideTouchable(true);popupWindow.update();popupWindow.showAtLocation(view, Gravity.CENTER, 0, 400);}});gridView = (GridView) view.findViewById(R.id.expression);expressions = new ArrayList<>();initExpression();expressionAdapter = new ExpressionAdapter(inflater, expressions);getter = new Html.ImageGetter() {@Overridepublic Drawable getDrawable(String source) {Drawable drawable = getResources().getDrawable(Integer.parseInt(source));drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());return drawable;}};gridView.setAdapter(expressionAdapter);gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Spanned spanned = Html.fromHtml("<img src='" + expressions.get(position).getImage() + "'/>", getter, null);//将表情插入到光标所在位置editText.getText().insert(editText.getSelectionStart(), spanned);}});choose.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {PopupWindow popupWindow = new PopupWindow(MainActivity.this);popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);popupWindow.setContentView(chooseView);popupWindow.setFocusable(true);popupWindow.setOutsideTouchable(true);popupWindow.update();popupWindow.showAtLocation(view, Gravity.CENTER, 0, 450);}});RadioGroup radioGroup = (RadioGroup) chooseView.findViewById(R.id.radiogroup);radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {RadioButton radioButton = (RadioButton) chooseView.findViewById(checkedId);name = (String) radioButton.getText();}});send.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (name.equals("send")) {String message = filterHtml(Html.toHtml(editText.getText()));chatMessage = new ChatMessage(R.mipmap.weheartit, "老大", "巴黎铁塔前的黎明", message, System.currentTimeMillis());chatMessage.setType(MessageAdapter.MESSAGE_RIGHT);} else if (name.equals("receive")) {String message = filterHtml(Html.toHtml(editText.getText()));chatMessage = new ChatMessage(R.mipmap.weheartit, "老二", "东京樱花后的黄昏", message, System.currentTimeMillis());chatMessage.setType(MessageAdapter.MESSAGE_LEFT);}data.add(chatMessage);adapter.notifyDataSetChanged();listView.setSelection(data.size());//将ListView定位到最后一行editText.setText("");//清空输入框的内容}});adapter = new MessageAdapter(inflater, data, getter);listView.setAdapter(adapter);}/*** 将文本转化为HTML格式后,发送的时候去掉除富文本以外的内容** @param str 转化为HTML格式的字符串* @return 富文本*/public String filterHtml(String str) {str = str.replaceAll("<(?!br|img)[^>]+>", "").trim();return str;}/***初始化表情*/private void initExpression() {Expression expression1 = new Expression();expression1.setImage(R.mipmap.ebg);expressions.add(expression1);Expression expression2 = new Expression();expression2.setImage(R.mipmap.ebh);expressions.add(expression2);Expression expression3 = new Expression();expression3.setImage(R.mipmap.ebl);expressions.add(expression3);Expression expression4 = new Expression();expression4.setImage(R.mipmap.ebo);expressions.add(expression4);Expression expression5 = new Expression();expression5.setImage(R.mipmap.ebw);expressions.add(expression5);Expression expression6 = new Expression();expression6.setImage(R.mipmap.eca);expressions.add(expression6);Expression expression7 = new Expression();expression7.setImage(R.mipmap.ecb);expressions.add(expression7);Expression expression8 = new Expression();expression8.setImage(R.mipmap.ecc);expressions.add(expression8);Expression expression9 = new Expression();expression9.setImage(R.mipmap.eew);expressions.add(expression9);}
}

好了,至此大功告成!让我们测试一下结果吧!
##运行结果:
首先是我们的界面
这里写图片描述
然后点击加号,选择我们要发送的类型,选择send
这里写图片描述
输入发送内容,点击表情,选择要发送的表情
这里写图片描述
点击发送
这里写图片描述
最后的效果:
这里写图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT登录界面设计及跳转主界面

文章目录 QT登录界面设计及跳转主界面界面样式创建流程界面设计所需控件界面外观设计添加底色设置密码输入框以密文显示&#xff1a; 程序设计取消按钮登录按钮 注&#xff1a; QT登录界面设计及跳转主界面 界面样式 先贴图 创建流程 首先创建界面&#xff1a; 选择无按钮…

开源一个ChatGPT AI角色对话项目

最近对AI很感兴趣&#xff0c;花了几天时间学习Android&#xff0c;尝试着结合Bmob AI SDK&#xff0c;做了一个具有角色功能的开源项目。可能是因为目前这类型的项目还比较少&#xff0c;发布之后&#xff0c;竟然还获得了几个star和fork。对于一个Android小白来说&#xff0c…

公司宣传片拍摄文案怎么写?

公司宣传片拍摄文案怎么写&#xff1f; 如今的公司宣传片拍摄已成为趋势&#xff0c;很多的企业采用宣传片的方式进行企业的宣传推广。在进行宣传片制作时&#xff0c;宣传片制作需求不同&#xff0c;宣传片制作内容也不同。一般宣传片制作内容是整个宣传片制作的关键&#xf…

短视频拍摄脚本怎么写

优质的短视频每一个镜头都经过精心设计&#xff0c;镜头的设计就是利用镜头脚本&#xff0c;提前设想好一切想要的镜头效果和画面&#xff0c;最终作品才能一气呵成的呈现出来&#xff0c;接下来就来分析一下短视频拍摄脚本怎么写&#xff0c;短视频拍摄脚本有什么用? 短视频脚…

微信小程序:调用API接口

首先去果创云之类的API调用的网站找到你想调用的API 以大学查询接口为例 复制API的接口&#xff0c;然后要现在第一个&#xff1f;前面加上appkey&#xff0c;然后name可以换成变量&#xff0c;最后的10是显示的条数&#xff0c;也可以改。 最后效果是可以查询你想要查询的学校…

微信小程序开发调用接口

今天我们自己调用自己商城中的接口 以下是简单的示例 这是自己的目录结构&#xff0c;我选择的是index1来开发 首先在 index.js中想写逻辑代码 其中page里面的data里面是前台展示时的一些数据&#xff0c;而onload里面是调用的接口&#xff0c;调用的方式为get调用&#xff…

微信小程序调用api接口实例

页面效果&#xff1a; 1、首先在微信开发者工具中开启http域名 2、然后回到开发者工具中&#xff0c;找到详情》项目配置&#xff0c;进行刷新或者重新编译 3、在index.wxml页面中写一个button: <view><button bindTap"test">测试</button> <…

GPT-4 发布:在考试中击败 90% 的人类;谷歌开放大语言模型 PaLM API;FireFox 111 发布|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

.net应用程序和TW3的ADS之间通讯

Beckhoff ADS (Automation DeviceSpecification)提供一个应用程序之间互相通信的接口&#xff0c;在TW3系统中&#xff0c;TwinCAT PLC&#xff0c;TwinCAT NC等被设计成虚拟的自动化设备&#xff0c;类似于实际的物理设备与设备之间通过基于TCP协议的路由来交换信息&#xff0…

基于CTP的期货集中管理系统之登录篇

上一篇是说要做这个管理系统&#xff0c;还没开始做&#xff0c;就头皮发麻了。想想要实现那么多功能&#xff0c;已经想放弃了。但是呢&#xff0c;我们是日拱一卒的时间主义者&#xff0c;小小的抵触情绪是无法打到我们的。 前端使用VUE,后端使用C来做分布式交易管理总控系统…

仿QQ即时通信系统

这学期学了网络编程&#xff0c;课设是让做一个通信系统&#xff0c;就模仿腾讯的产品设计一个仿QQ的通信系统。PS&#xff1a;用的时候&#xff0c;背景可以改一下&#xff0c;XX公司需要一个内部通信系统… 话不多说&#xff0c;先上图片&#xff0c;再慢慢讲原理吧。 效果示…

基于nchan打造百万用户的聊天室

大家好&#xff0c;我是烤鸭&#xff1a; 这次介绍下nchan&#xff0c;nginx的一个module。 nchan 源码: https://github.com/slact/nchan 官网: https://nchan.io/ nginx 配置说明文档: https://nchan.io/documents/nginxconf2016-slides.pdf 测试环境搭建 4 台linux cent…

基于MT5的沪深股票回测二 导入历史数据

回测的基础是是历史数据 以导入日线数据为例 1.打开交易品种 2. 找到目标合约 3.选择要处理的数据周期&#xff0c;日线选择daily 然后导入处理后的日K线数据 注意历史数据需要符合MT5的数据格式 此次有一个不是bug的显示&#xff0c;最多显示2000条记录&#xff0c;实际更多…

探索 Google Bard 的 10 大令人兴奋的新功能

这家科技巨头开发的人工智能聊天机器人 Google Bard 最初发布时,收到的评价平平。然而,随着最近在 Google I/O 2023 开发者大会上发布其改进版本,Google Bard 的情况发生了重大变化。全新改进的 Google Bard AI 具有许多令人兴奋的功能。让我们仔细看看谷歌吟游诗人的特点:…

万众瞩目,谷歌的反击来了!全新PaLM 2反超GPT-4,办公全家桶炸裂升级,Bard史诗进化...

Datawhale干货 最新&#xff1a;谷歌 PaLM 2&#xff0c;来源&#xff1a;量子位 万众瞩目&#xff0c;谷歌的反击来了。 现在&#xff0c;谷歌搜索终于要加入AI对话功能了&#xff0c;排队通道已经开放。 当然这还只是第一步。 大的还在后面&#xff1a; 全新大语言模型PaLM …

LaTeX插入图片

基本语法 常用选项[htbp]是浮动格式&#xff08;参考《LaTeX2e插图指南》16.2节和《Ishort》3.9节&#xff09;&#xff1a; 『h』当前位置。将图形放置在正文文本中给出该图形环境的地方。如果本页所剩的页面不够&#xff0c;这一参数将不起作用。『t』顶部。将图形放置在页…

chatgpt赋能python:Python抓取电脑应用软件数据

Python抓取电脑应用软件数据 随着互联网技术的不断发展&#xff0c;我们的生活方式也在发生着巨大变化&#xff0c;如今&#xff0c;我们已经可以依靠计算机应用软件对生活的各个方面进行掌控。而如何获取这些软件的数据&#xff0c;以及对这些数据进行分析&#xff0c;也成为…

chatgpt赋能python:Python程序如何变成电脑程序

Python程序如何变成电脑程序 简介 Python是一种高级编程语言&#xff0c;它在数据科学、人工智能、Web开发、机器学习、AI等领域非常流行。在Python中编写的程序需要转化为计算机程序才能执行。在这篇文章中&#xff0c;我们将解释Python编写的程序如何变成电脑程序。 什么是…

chatgpt赋能python:Python可以入侵别人电脑吗?

Python可以入侵别人电脑吗&#xff1f; Python自从诞生以来便一直以来备受关注&#xff0c;其简单易学、高效实用的特点让无数人喜爱并成为了开发人员的首选编程语言。但是&#xff0c;你可能会想知道&#xff1a;Python能够入侵别人电脑吗&#xff1f;今天我们就来探讨一下这…

chatgpt赋能python:如何使用Python绕过电脑开机密码?

如何使用Python绕过电脑开机密码&#xff1f; 随着科技的发展&#xff0c;计算机已经成为我们生活和工作中必不可少的工具。当然&#xff0c;在使用计算机时保护自己的隐私也是非常重要的。电脑开机密码是最基本的保护措施之一&#xff0c;但是如果忘记了密码该怎么办呢&#…