首页 文章 精选 留言 我的

精选列表

搜索[系统工具],共10000篇文章
优秀的个人博客,低调大师

Feed流系统设计-总纲

简介 差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,以及后来的今日头条、快手等。这些移动化联网时代的新产品在过去几年间借着智能手机的风高速成长。 这些产品都是Feed流类型产品,由于Feed流一般是按照时间“从上往下流动”,非常适合在移动设备端浏览,最终这一类应用就脱颖而出,迅速抢占了上一代产品的市场空间。 Feed流是Feed + 流,Feed的本意是饲料,Feed流的本意就是有人一直在往一个地方投递新鲜的饲料,如果需要饲料,只需要盯着投递点就可以了,这样就能源源不断获取到新鲜的饲料。 在信息学里面,Feed其实是一个信息单元,比如一条朋友圈状态、一条微博、一条咨询或一条短视频等,所以Feed流就是不停更新的信息单元,只要关注某些发布者就能获取到源源不断的新鲜信息,我们的用

优秀的个人博客,低调大师

DApp游戏系统开发

DApp 作为区块链技术落地的重要一环,在 Ethereum、EOS 等开发平台的主网络陆续上线后有了一定的发展,而游戏 DApp 作为发展态势最迅猛的一类 DApp,吸引了众多开发者和传统机构的注意。从 2017 年 12 月的 CryptoKitties 到 2018 年 7 月的 Fomo3D,部分热门的游戏 DApp 一度让整个 Ethereum 网络瘫痪,并出现了大量的模仿其游戏机制的收集类、Ponzi 类、FOMO 类的游戏 DApp。在 EOS 平台主网络上线后,其快速确认、无手续费的特性使得竞猜类游戏大规模爆发,并因为 EOS 独特的机制设置,衍生出大量生态设施。 游戏 DApp 的大规模爆发虽然产生了巨量的交易额,但其中仍旧存在不少问题。集中于少数几个 DApp上 的交易额、开发平台与底层协议的稀缺、同质化的游戏机制、过高的用户门槛与使用门槛都在削弱玩家的游戏意愿;良莠不齐的代码质量、不开源的智能合约既不能发挥区块链的优势,又使玩家担忧资金安全。联系shewenfa 要开发一个DAPP,你首先得想明白该DAPP能解决什么问题,其次你要撰写一份项目白皮书,描述该DAPP使用的技术原理、共识机制等。想要从零开始开发一个完整的区块链项目太过复杂,所以目前普通的开发者大多会选择一个相对成熟的平台,依托平台成熟的开发环境来开发自己的DAPP。如此以来,DAPP的开发工作就简单了不少。 当前,DAPP的最流行的开发平台是Ethereum(以太坊)。Ethereum(以太坊)是一个图灵完备的区块链一站式开发平台,采用多种编程语言实现协议,采用Go语言写的客户端作为默认客户端。它允许任何人在平台中建立和使用通过区块链技术运行的分布式应用。我们可以把它理解为区块链领域的Android,它是一个开发平台,用户可以像基于Android Framework一样基于区块链技术开发应用 但随着技术的进步,尤其是在闪电网络、侧链技术等陆续落地之后,游戏的性能将有所提高,而传统游戏厂商的进入也将带来新的观念,游戏机制和通证机制的设置将更为合理与多样。而在技术落地之前,仅将虚拟资产上链的通证上链类游戏或许更易出现多样化的游戏玩法,同时,生态中部分机构或开发者人工地实现部分“跨链”效果。此外,随着开发平台的增多,不同种类的游戏或根据各自的操作需求、资产安全需求选择不同的开发平台,形成游戏种类与开发平台挂钩的状况。

优秀的个人博客,低调大师

Android 系统原生dialog使用

先上图,不上图的程序员不是好程序员: 两个按钮的 dialog 三个按钮的 dialog 列表样式 dialog 单选 dialog 多选 dialog 转圈加载 dialog 带有加载进度的 dialog 带有输入框 dialog 引入布局的 dialog 看了效果下面该看代码了 1、MainActivity的xml内代码 <?xml version="1.0" encoding="utf-8"?> <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"> <Button android:id="@+id/btn_two" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="最普通的 dialog" android:textAllCaps="false" /> <Button android:id="@+id/btn_three" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="三个按钮的 dialog" android:textAllCaps="false" /> <Button android:id="@+id/btn_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="列表 dialog" android:textAllCaps="false" /> <Button android:id="@+id/btn_multi_select" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="多选 dialog" android:textAllCaps="false" /> <Button android:id="@+id/btn_single_select" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="单选 dialog" android:textAllCaps="false" /> <Button android:id="@+id/btn_waiting" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="等待 dialog" android:textAllCaps="false" /> <Button android:id="@+id/btn_loading" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="加载 dialog" android:textAllCaps="false" /> <Button android:id="@+id/btn_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="输入 dialog" android:textAllCaps="false" /> <Button android:id="@+id/btn_my_style" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="自定义 dialog" android:textAllCaps="false" /> </LinearLayout> 2、MainActivity的java文件内代码即逻辑代码 public class MainActivity extends AppCompatActivity implements View.OnClickListener { private AlertDialog.Builder builder; private ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnTwo = findViewById(R.id.btn_two); Button btnThree = findViewById(R.id.btn_three); Button btnList = findViewById(R.id.btn_list); Button btnMultiSelect = findViewById(R.id.btn_multi_select); Button btnSingleSelect = findViewById(R.id.btn_single_select); Button btnWaiting = findViewById(R.id.btn_waiting); Button btnLoading = findViewById(R.id.btn_loading); Button btnInput = findViewById(R.id.btn_input); Button btnMyStyle = findViewById(R.id.btn_my_style); btnTwo.setOnClickListener(this); btnThree.setOnClickListener(this); btnList.setOnClickListener(this); btnMultiSelect.setOnClickListener(this); btnSingleSelect.setOnClickListener(this); btnWaiting.setOnClickListener(this); btnLoading.setOnClickListener(this); btnInput.setOnClickListener(this); btnMyStyle.setOnClickListener(this); } @Override public void onClick(View view) { int id = view.getId(); switch (id) { case R.id.btn_two://最普通dialog showTwo(); break; case R.id.btn_three://三个按钮dialog showThree(); break; case R.id.btn_list://列表样式dialog showList(); break; case R.id.btn_multi_select://多选dialog showMultiSelect(); break; case R.id.btn_single_select://单选dialog showSingSelect(); break; case R.id.btn_waiting://等待dialog showWaiting(); break; case R.id.btn_loading://加载进度dialog showLoading(); break; case R.id.btn_input://输入框dialog showInput(); break; case R.id.btn_my_style://自定义dialog showMyStyle(); break; default: } } /** * 两个按钮的 dialog */ private void showTwo() { builder = new AlertDialog.Builder(this).setIcon(R.mipmap.ic_launcher).setTitle("最普通dialog") .setMessage("我是最简单的dialog").setPositiveButton("确定(积极)", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //ToDo: 你想做的事情 Toast.makeText(MainActivity.this, "确定按钮", Toast.LENGTH_LONG).show(); } }).setNegativeButton("取消(消极)", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //ToDo: 你想做的事情 Toast.makeText(MainActivity.this, "关闭按钮", Toast.LENGTH_LONG).show(); dialogInterface.dismiss(); } }); builder.create().show(); } /** * 三个按钮的 dialog */ private void showThree() { builder = new AlertDialog.Builder(this).setIcon(R.mipmap.ic_launcher).setTitle("三个按钮dialog") .setMessage("三个按钮dialog").setPositiveButton("确定(积极)", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //ToDo: 你想做的事情 Toast.makeText(MainActivity.this, "确定按钮", Toast.LENGTH_LONG).show(); } }).setNeutralButton("你猜(中立)", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(MainActivity.this, "你猜按钮", Toast.LENGTH_LONG).show(); } }).setNegativeButton("取消(消极)", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //ToDo: 你想做的事情 Toast.makeText(MainActivity.this, "关闭按钮", Toast.LENGTH_LONG).show(); dialogInterface.dismiss(); } }); builder.create().show(); } /** * 列表 dialog */ private void showList() { final String[] items = {"item 1", "item 2", "item 3", "item 4", "item 5", "item 6"}; builder = new AlertDialog.Builder(this).setIcon(R.mipmap.ic_launcher) .setTitle("列表dialog") .setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(MainActivity.this, "你点击的内容为: " + items[i], Toast.LENGTH_LONG).show(); } }); builder.create().show(); } /** * 多选 dialog */ private void showMultiSelect() { final List<Integer> choice = new ArrayList<>(); final String[] items = {"多选1", "多选2", "多选3", "多选4", "多选5", "多选6"}; //默认都未选中 boolean[] isSelect = {false, false, false, false, false, false}; builder = new AlertDialog.Builder(this).setIcon(R.mipmap.ic_launcher) .setTitle("多选dialog") .setMultiChoiceItems(items, isSelect, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i, boolean b) { if (b) { choice.add(i); } else { choice.remove(i); } } }).setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { StringBuilder str = new StringBuilder(); for (int j = 0; j < choice.size(); j++) { str.append(items[choice.get(j)]); } Toast.makeText(MainActivity.this, "你选择了" + str, Toast.LENGTH_LONG).show(); } }); builder.create().show(); } private int choice; /** * 单选 dialog */ private void showSingSelect() { //默认选中第一个 final String[] items = {"单选1", "单选2", "单选3", "单选4", "单选5", "单选6"}; choice = -1; builder = new AlertDialog.Builder(this).setIcon(R.mipmap.ic_launcher).setTitle("单选列表") .setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { choice = i; } }).setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { if (choice != -1) { Toast.makeText(MainActivity.this, "你选择了" + items[choice], Toast.LENGTH_LONG).show(); } } }); builder.create().show(); } /** * 圆圈加载进度的 dialog */ private void showWaiting() { progressDialog = new ProgressDialog(this); progressDialog.setIcon(R.mipmap.ic_launcher); progressDialog.setTitle("加载dialog"); progressDialog.setMessage("加载中..."); progressDialog.setIndeterminate(true);// 是否形成一个加载动画 true表示不明确加载进度形成转圈动画 false 表示明确加载进度 progressDialog.setCancelable(false);//点击返回键或者dialog四周是否关闭dialog true表示可以关闭 false表示不可关闭 progressDialog.show(); } /** * 带有进度的 dialog */ private void showLoading() { final int MAX_VALUE = 100; progressDialog = new ProgressDialog(this); progressDialog.setProgress(0); progressDialog.setTitle("带有加载进度dialog"); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMax(MAX_VALUE); progressDialog.show(); new Thread(new Runnable() { @Override public void run() { int progress = 0; while (progress < MAX_VALUE) { try { Thread.sleep(100); progress++; progressDialog.setProgress(progress); } catch (InterruptedException e) { e.printStackTrace(); } } //加载完毕自动关闭dialog progressDialog.cancel(); } }).start(); } /** * 一个输入框的 dialog */ private void showInput() { final EditText editText = new EditText(this); builder = new AlertDialog.Builder(this).setTitle("输入框dialog").setView(editText) .setPositiveButton("读取输入框内容", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(MainActivity.this, "输入内容为:" + editText.getText().toString() , Toast.LENGTH_LONG).show(); } }); builder.create().show(); } /** * 原生自定义 dialog */ private void showMyStyle() { @SuppressLint("InflateParams") View view = LayoutInflater.from(this).inflate(R.layout.layout_test, null); final EditText etUsername = view.findViewById(R.id.et_username); final EditText etPassword = view.findViewById(R.id.et_password); builder = new AlertDialog.Builder(this).setView(view).setTitle("自定义dialog——登录").setIcon(R.mipmap.ic_launcher) .setPositiveButton("登录", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(MainActivity.this, "账号: " + etUsername.getText().toString() + " 密码: " + etPassword.getText().toString() , Toast.LENGTH_LONG).show(); } }); builder.create().show(); } } 3、介绍一些好用的第三方dialog库 1、material-dialogs 2、FlycoDialog_Master

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册