全部Android流媒体后端前端版本控制服务器公告产品经理程序人生设计师猿科技
最新 最热 官方 加精

阿木木 | 2天前 |

新来个技术总监:谁再用 count(*) 查询记录数,以后就不用来了!

前言 最近我在公司优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有所帮助。 我们使用的数据库是Mysql8,使用的存储引擎是Innodb。这次优化除了优化索引之外,更多的是在优化count( )。 通常情况下,分页接口一般会查询两次数据库,第一次是获取具体数据,第二次是获取总的记录行数,然后把结果整合之后,再返回。 查询具体数据的sql,比如是这样的: js select id,name from user limit 1,20; 它没有性能问题。 但另外一条使用count( )查询总记录行数的sql,例如: js select count( ) from user; 却存在性能差的问题。 为什么会出现这种情况呢? 1 count( )为什么性能差? 在Mysql中,count( )的作用是统计表中记录的总行数。 而count( )的性能跟存储引擎有直接关系,并非所有的存储引擎,count( )的性能都很差。 在Mysql中使用最多的存储引擎是:innodb和myisam。 在myisam中会把总行数保存到磁盘上,使用count( )时,只需要返回那个数据即可,无需额外的计算,所以执行效率很高。 而innodb则不同,由于它支持事务,有MVCC(即多版本并发控制)的存在,在同一个时间点的不同事务中,同一条查询sql,返回的记录行数可能是不确定的。 在innodb使用count( )时,需要从存储引擎中一行行的读出数据,然后累加起来,所以执行效率很低。 如果表中数据量小还好,一旦表中数据量很大,innodb存储引擎使用count( )统计数据时,性能就会很差。 2 如何优化count( )性能? 从上面得知,既然count( )存在性能问题,那么我们该如何优化呢? 我们可以从以下几个方面着手。 2.1 增加redis缓存 对于简单的count( ),比如:统计浏览总次数或者浏览总人数,我们可以直接将接口使用redis缓存起来,没必要实时统计。 当用户打开指定页面时,在缓存中每次都设置成count = count+1即可。 用户第一次访问页面时,redis中的count值设置成1。用户以后每访问一次页面,都让count加1,最后重新设置到redis中。 ![

 15 |  0 |  0

阿木木 | 3周前 | 安卓优化Android

Android中MediaPlayer实现按次数呼叫响铃功能(播放assets下文件)

话不多说直接上代码 js public class CallMediaPlayer { private MediaPlayer mediaPlayer; private int playbackNum = 7;//播放次数(按14秒算) private PlayResultCallBack playResultCallBack; //播放回调 public interface PlayResultCallBack { //开始播放 void onStatrPlay(); //结束播放 void onStopPlay(); } / 开始播放和停止播放的监听设置 @param playResultCallBack / public void setPlayResultCallBack(PlayResultCallBack playResultCallBack ){ this.playResultCallBack=playResultCallBack; } / 开始呼叫响铃 / public void startCallRinging(Activity activity) { if (mediaPlayer null) { mediaPlayer = new MediaPlayer(); } if (mediaPlayer.isPlaying()) { return; } mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { if (playbackNum 1 != 0) {

 144 |  0 |  0 安卓优化Android

阿木木 | 2个月前 | UI界面Android

Android中RecyclerView 自动滑动到底部的代码设置

今天在写聊天记录页面,RecyclerView 来做聊天记录列表展示。当用户发送消息后,如何让RecyclerView滑到最底部? 复制代码即可 js LinearLayoutManager linearLayoutManager=new LinearLayoutManager(mContext); linearLayoutManager.setStackFromEnd(true); linearLayoutManager.scrollToPositionWithOffset(imMsgItemAdapter.getItemCount()-1,Integer.MIN_VALUE); recyclerview.setLayoutManager(linearLayoutManager);

 105 |  0 |  0 UI界面Android

阿木木 | 2个月前 | Android

Android 代码动态设置 drawableLeft|Right|Top|Bottom

XML js <TextView android:id="@+id/demo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@mipmap/abc" android:drawableRight="@mipmap/abc" android:drawableTop="@mipmap/abc" android:drawableBottom="@mipmap/abc" android:drawablePadding="5dp" android:text="abc" / android:drawableLeft 在文本框内文本的左边绘制指定图像 android:drawableRight 在文本框内文本的右边绘制指定图像 android:drawableTop 在文本框内文本的顶端绘制指定图像 android:drawableBottom 在文本框内文本的底端绘制指定图像 android:drawablePadding 设置文本框内文本与图形之间的间距 JAVA js Drawable abc= getResources().getDrawable(R.mipmap.abc); // 调用 setCompoundDrawables 时,必须调用 Drawable.setBounds() 方法,否则图片不显示 abc.setBounds(0, 0, abc.getMinimumWidth(), abc.getMinimumHeight()); demo.setCompoundDrawables(abc, null, null, null); setCompoundDrawables(leftDrawable, topDrawable, rightDrawable, bottomDrawable) 在文本框内文本的四周绘制指定图像。

 117 |  0 |  0 Android

阿木木 | 2个月前 | Android

Android中用代码控制layout_gravity的设置

今天,简单讲讲android LinearLayout中如何使用setGravity()。 之前,在做一个功能时,需要根据数据的变化设置LinearLayout的gravity 。之前,自己写代码都是直接在xml文件里通过roid:gravity设置的属性,这次需要在java代码里动态设置时,居然不知道怎么设置。后来,在网上搜索了资料后,发现setGravity()就可以设置,这里记录一下。 在进行UI布局的时候,可能经常会用到 android:gravity 和 android:layout_Gravity 这两个属性。 LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravity。 他们的区别在于: android:gravity 属性是对该view中内容的限定.比如一个button 上面的text. 你可以设置该text 相对于view的靠左,靠右等位置. android:layout_gravity是用来设置该view相对与父view 的位置.比如一个button 在linearlayout里,你想把该button放在linearlayout里靠左、靠右等位置就可以通过该属性设置. 即android:gravity用于设置View中内容相对于View组件的对齐方式,而android:layout_gravity用于设置View组件相对于Container的对齐方式。 原理跟android:paddingLeft、android:layout_marginLeft有点类似。如果在按钮上同时设置这两个属性。 android:paddingLeft="30px" 按钮上设置的内容离按钮左边边界30个像素 android:layout_marginLeft="30px" 整个按钮离左边设置的内容30个像素 下面回到正题, 我们可以通过设置android:gravity="center"来让EditText中的文字在EditText组件中居中显示;同时我们设置EditText的android:layout_gravity="right"来让EditText组件在LinearLayout中居右显示。看下效果: 正如我们所看到的,在...

 95 |  0 |  0 Android

阿木木 | 2个月前 | Android

Android中 onActivityResult 回调中requestCode 随机问题

今天开发时出现一个问题,在activity的onActivityResult()方法中获取的requestCode并不是我调用startActivityForResult()方法时传入的requestCode,而是一个随机数。每次调用都是不同的数字。经检查发现是在Fragment里调用startActivityForResult()时没有使用getActivity()来调用。 修改前: js startActivityForResult(intent,0); 修改后: js getActivity().startActivityForResult(intent,0); 完美解决问题,记录一下

 93 |  0 |  0 Android

阿木木 | 2个月前 | Android

Android 简单实现SD卡文件管理器功能

项目中需要用到一个简单的文件选择器,来选择SD卡里的文件,做一个简单的DEMO功能实现。 ![dfac047e72e741fcaef5b5b78c369e14](https://qiniu.qjos.cn/dfac047e72e741fcaef5b5b78c369e14.jpeg) 写的比较粗糙,资源图片就不上传了,屏蔽掉即可!很简单的东西没什么技术含量,以后再继续优化吧! 功能 点击文件夹进入该文件夹下的目录并列出文件 非文件夹可直接选择选取该文件 Activity js package com.yh.fireworks.ui.activity; import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.yh.fireworks.R; import com.yh.fireworks.base.BaseActivity; import com.yh.fireworks.model.FileDataInfo; import com.yh.fireworks.ui.adapter.FolderManageAdapter; import com.yh.fireworks.utils.StringUtils; import com.yh.fireworks.utils.ToastUtils; import com.yh.fireworks.validate.util.StringUtil; import com.yh.fireworks.widget.WrapConte

 119 |  0 |  0 Android

阿木木 | 2个月前 | Android

Android 在Fragment中执行onActivityResult不被调用的简单解决方法

在Android开发中,我们经常会用到FragmentActivity下嵌套多个Fragment,但是在开发过程中会发现在嵌套的Fragment中使用onActivityResult回调方法没有被执行。 网上也有很多解决方法,但是说的都比较麻烦,所以今天给大家推荐一种超简单的用法, 在Fragment和FragmentActivity中都要重写onActivityResult方法,并且要保证两者的请求码或者结果码一致。代码如下: 在FragmentActivity中 js @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(resultCode){ case 1://该结果码要与Fragment中的一致 //我这里使用的是根据结果码获取数据,然后加上下面一句代码,其 //他的什么都不用做 super.onActivityResult(requestCode,resultCode,data); break; case 2: super.onActivityResult(requestCode,resultCode,data); break; ...... } } 在Fragment中 js @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (resultCode){ case 1://该结果码与FragmentActivity中是保持一致的 //在这里获取你需要的数据 break; case 2:

 92 |  0 |  0 Android

wb | 2个月前 | vuecsshtml

tag标签动态下横线效果

使用CSS动画-animation实现该效果 animation可以设置多个节点精确控制一个或一组动画常用来实现复杂的动画效果 @keyframes定义动画 从宽度0像素白色变为宽度74px蓝色 js @keyframes demo{ from{width: 0px;background-color: rgb(235,248,250);} to{width: 74px;background-color: rgb(0,82,217)} } html js <div class="categories" <span class="tag" :class="{ 'active': activeCategory = item }" {{ item }} </span </div CSS after伪类 js .tag::after { position: absolute; content: ''; width: 65px; height: 5px; margin-top:32px; border-radius: 3px; background-color: rgb(250, 251, 253); color: rgb(17, 16, 16); font-weight: bold; } 鼠标悬停时 0.25S分24步完成从宽度0像素白色变为宽度74px蓝色 24帧-30帧即可实现不卡顿的动画效果所以24步完成 js js.tag-category:hover::after{ animation: demo 0.25s steps(24) forwards; } 实现效果 ![629791ee803945f19a48d1d60d5eef92](https://qiniu.qjos.cn/629791ee803945f19a48d1d60d5eef92.gif)

 217 |  0 |  0 vuecss

wb | 2个月前 | css

css实现赛博朋克官网按钮

css代码 js { box-sizing: border-box; padding: 0; margin: 0; font-family: BlenderProBold, "PingFang SC", "Microsoft Yahei", sans-serif; } main { background: hsl(55, 100%, 65%); width: 100vw; height: 100vh; display: flex; align-items: center; justify-content: center; } .button { width: 300px; height: 80px; background: none; display: flex; align-items: center; justify-content: center; position: relative; cursor: pointer; } .button::after, .button::before, .glitch { content: ""; display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; clip-path: polygon( 0 0, 100% 0, 100% 100%, calc(100% 25px) 100%, calc(100% 25px) calc(100% 10px), cal

 141 |  0 |  0 css

阿木木 | 2个月前 | Nginx

Nginx 可视化神器来了!复杂配置一键生成,监控管理一条龙!

nginx是一个高性能的HTTP和反向代理服务器。在部署项目中,经常会用到,但是配置是比较麻烦的,很容易出错,今天给大家推荐一个非常好用的可视化平台 - nginx-gui。 项目功能 配置管理:配置监听列表和规则列表 高级配置:全局校验 nginx 配置文件 性能监控:监控服务器状态,包括 CPU、内存、硬盘等状态 负载管理:配置负载节点、权重、最大出错数量等 ![5a9695f1ef274a0fa8bd1f0c7a3948e2](https://qiniu.qjos.cn/5a9695f1ef274a0fa8bd1f0c7a3948e2.png) 项目使用 1、下载安装包,选择适合操作系统的版本 js https://github.com/onlyGuo/nginx-gui/releases/tag/1.6 ![824b14e7f18b4e788de268a06f49b220](https://qiniu.qjos.cn/824b14e7f18b4e788de268a06f49b220.png) 2、修改配置文件 js 文件位置:conf/conf.properties 配置 nginx 安装路径和 nginx.config 文件路径 js nginx 安装路径 nginx.path = /usr/local/nginx/1.8.1 nginx 配置文件全路径 nginx.config = /usr/local/nginx/1.8.1/conf/nginx.conf 用户 account.admin = admin 注意:在 win 系统中,目录也要是 / ,例如:D:/software/nginx-1.8.1 3、启动服务 js win 中执行 startup.bat linux 64位版本需要将 lib/bin/下的 java_vms 文件重命名为 java_vms_nginx_gui 启动 js nohup bash /root/web/nginx-gui/startup.sh logs/nginx-gui.out & 默认端口 8889, 默认账号密码都是 admin 系统截图 ![5433b1a5abae420d825b1f

 219 |  0 |  0 Nginx

阿木木 | 2个月前 | 安卓优化特效UI界面Android

Android实现TextView显示内容关键字变颜色的方法

一、字符串关键字变色 在界面显示的时候,偶尔需要将某些字符串中特定的字符串重点标出 如下图所示: ![9ec16a9962f84e3d80feeddc4fc1ac46](https://qiniu.qjos.cn/9ec16a9962f84e3d80feeddc4fc1ac46.png) 便有了下面的方法。这个方法针对于比较 固定的字符串 ,并且需要自己 计算 需要变色的文字 位置 ,代码如下: js public static CharSequence setColor(Context context, String text, String text1, String text2) { SpannableStringBuilder style = new SpannableStringBuilder(text); // 关键字“孤舟”变色,0-text1.length() style.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorPrimary)), 0, text1.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 关键字“寒江雪”变色,text1.length() + 6-text1.length() + 6 + text2.length() style.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorAccent)), text1.length() + 6, text1.length() + 6 + text2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return style; } 二、搜索关键字变色 要使搜索关键字变色,只需要对比关键字是否和字符串之间的某些字相同,然后将相同的字改变颜色就行了。 首先说一下 如何判断一个字符串包含另一个字符串 ,有两种方法: 1. string.indexOf("xxx"); ——这个方法用于查找关键字的位置,返回一个int值,没找到则返回-1;

 143 |  0 |  0 安卓优化特效

阿木木 | 2个月前 | Android

Android 获取IMEI(Android 10以下可用)

1、获取手机IMEI,从android 5.0之后通过getImei获取 js public static String getIMEI(Context context){ String imei = ""; try { TelephonyManager tm = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE); if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){ imei = tm.getDeviceId(); }else { Method method = tm.getClass().getMethod("getImei"); imei = (String) method.invoke(tm); } } catch (Exception e) { e.printStackTrace(); } return imei; } 2、判断哪个卡槽有插卡,从api 23开始,api23之前需要反射来获取,方法名也有所差别 js @TargetApi(Build.VERSION_CODES.M) public static void JudgeSIM(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE); //获取当前SIM卡槽数量 int phoneCount = tm.getPhoneCount(); //获取当前SIM卡数量 int activeSubscriptionInfoCount = SubscriptionManager.from(context).getActiveSubscriptionInfoCount(); List<SubscriptionInfo activeSubscriptionInfoList = SubscriptionManager.from(con

 136 |  0 |  0 Android

阿木木 | 2个月前 | Android

Android 完美实现获取手机硬件信息(CPU、内存)工具类

kotlin版 js import android.app.ActivityManager import android.content.Context import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io. / 获取硬件信息工具类,如:CPU参数、内存参数等 / class HardwareInfoUtils { //获取CPU整体温度,单位:°C suspend fun getCPUTemperature() : Float{ var temperature : String withContext(Dispatchers.IO){ val temperatureOfCPUFileName = "/sys/class/thermal/thermal_zone0/temp" temperature = readCpuInfo(temperatureOfCPUFileName) } return temperature.toFloat()/1000.0F ?: 0.00F } / 获取CPU整体使用率,返回是"百分比" 如返回:22.0,表示CPU占用率是22.0% / suspend fun getCPUUsage() : Float{ var rate : Float = 0.00f withContext(Dispatchers.IO){ var process : Process? = null try{ process = Runtime.getRuntime().exec("top -n 1") val reader : BufferedReader = BufferedReader( InputStreamReader(process.inputStream

 180 |  0 |  0 Android

阿木木 | 2个月前 | 编解码

YV12和NV21数据格式区别

标准I420与YV12仅仅是格式上的U V顺序不同;;; YV12格式: js |Y第一行:|Y  Y|Y  Y|Y  Y|Y  Y| |Y第二行:|Y  Y|Y  Y|Y  Y|Y  Y| |Y第三行:|Y  Y|Y  Y|Y  Y|Y  Y| |Y第四行:|Y  Y|Y  Y|Y  Y|Y  Y| |V第一行:|V0|V1|V2|V3| |U第二行:|V4|V5|V6|V7| |V第三行:|U1|U2|U3|U4| |U第四行:|U4|U5|U6|U7| NV21格式: js |Y第一行:|Y  Y|Y  Y|Y  Y|Y  Y| |Y第二行:|Y  Y|Y  Y|Y  Y|Y  Y| |Y第三行:|Y  Y|Y  Y|Y  Y|Y  Y| |Y第四行:|Y  Y|Y  Y|Y  Y|Y  Y| |V第一行:|V0|U0|V1|U1| |U第二行:|V2|U2|V3|U3| |V第三行:|U4|U4|V5|U5| |V第四行:|V6|U6|V7|U7| NV12格式: js |Y第一行:|Y  Y|Y  Y|Y  Y|Y  Y| |Y第二行:|Y  Y|Y  Y|Y  Y|Y  Y| |Y第三行:|Y  Y|Y  Y|Y  Y|Y  Y| |Y第四行:|Y  Y|Y  Y|Y  Y|Y  Y| |V第一行:|U0|V0|U1|V1| |U第二行:|U2|V2|U3|V3| |V第三行:|U4|V4|U5|V5| |U第四行:|U6|V6|U7|V7| I420: YYYYYYYY UU VV = YUV420P YV12: YYYYYYYY VV UU = YUV420P NV12: YYYYYYYY UVUV = YUV420SP NV21: YYYYYYYY VUVU = YUV420SP H264在进行编码的时候需要标准的YUV(4:2:0)。但是这里需要注意的是,虽然YV12也是(4:2:0),但是YV12和I420的却是不同的,uv是相反的 YUYV格式如下: Y0U0Y1V0 Y2U1Y3V1..........

 195 |  0 |  0 编解码

阿木木 | 2个月前 | Android

Android 获取相机的分辨率

安卓系统在获取相机分辨率时,可以参考SDK中的API,获取相机的参数: Camera.Parameters parameters = camera.getParameters(); 获取预览的各种分辨率: js List<Size supportedPreviewSizes = parameters.getSupportedPreviewSizes(); 获取摄像头支持的各种分辨率: js List<Size supportedPictureSizes = parameters.getSupportedPictureSizes(); 例如:获取照相机参数,设置需要的参数,其余缺省 js Camera camera = Camera.open(); Camera.Parameters parameters = camera.getParameters(); 设置照片格式: js parameters.setPictureFormat(PixelFormat.JPEG); 设置预浏尺寸,注意要在摄像头支持的范围内选择: js parameters.setPreviewSize(WIDTH, HEIGHT); 设置照片分辨率,注意要在摄像头支持的范围内选择 js parameters.setPictureSize(WIDTH, HEIGHT); 设置照相机参数: js camera.setParameters(parameters); 开始拍照: js camera.startPreview(); 以上就是获取相机分辨率的步骤。 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。

 209 |  0 |  0 Android

阿木木 | 2个月前 | linux

linux源码目录结构

为什么要分享内核的目录结构呢,因为内核过于庞大了,对于初次接触内核,往往会因为内核过于庞大望而却步,从入门到放弃。从1991年linus发布第一版的linux至今已经经过30年的发展了。全世界无数的开源贡献者对linux做出贡献,同样linux的代码量也从最初的1万行的数量级,达到现在的几千万行的数量级。而一个人能同一时刻读懂的代码量也就1万行左右。所以这么多代码是不可能细节到每一句都读懂的。如果阅读源码有正确的顺序和方法会事半功倍。这篇文章,描述一下linux的目录结构,对初学者阅读linux源码会有帮助。阅读的时候能抓住重点,进而顺藤摸瓜逐渐上手,找到自己的方法。 一 内核目录结构 通常我们下载一份linux的源码解压好源码之后目录结构如下: js . ├── arch//该目录下的代码和芯片架构相关,比如x86,mips,arm,arm64 ├── block//块设备相关的一些common代码,驱动在drivers目录下 ├── certs//加密标签相关的一些代码 ├── crypto//加密相关的一些代码 ├── Documentation//内核参考文档 ├── drivers//该目录应该是最大的,也是裁剪最多的,各种驱动子系统和驱动代码 ├── firmware//忽略 ├── fs//各种文件系统的框架部分代码,驱动在drivers目录下 ├── include//按照功能分类的系统的一些头文件, ├── init//系统初始化的common部分代码 ├── ipc//消息队列,系统调用,信号量等的common部分代码 ├── kernel//内核里面最核心的base代码 ├── lib//从名字可以看出来,是其他地方会使用到的一些公共代码 ├── mm//内存管理部分的common代码 ├── net//网络协议栈的公共代码,重点在协议,网卡驱动在drivers目录下 ├── samples//各个子系统的使用例子代码,初学者可以做参看 ├── scripts//编译内核的时候会用到一些辅助工具和脚本,在该目录下,以及反汇编调试内核工具 ├── security//系统安全相关的一些代码 ├── sound//声卡相关的代码alsa等 ├── tools//内核提供的一些小工具,主要是操作内核提供的节点之类的比如/dev/

 225 |  1 |  0 linux

阿木木 | 2个月前 | Android

GPS与GPRS分别是什么?

GPS和GPRS只有一个字母的区别,很容易让用户产生误解。今天我们就通过对比找出GPS和GPRS的意义和作用。 GPS的概念:GPS是GlobalPosiTIoningSystem的英文缩写,中文缩写为“globalposiTIoningsystem”。GPS是美国陆军、海军和空军于20世纪70年代联合研制的新一代空间卫星导航定位系统。GPS功能必须具备三个要素:GPS终端、传输网络、监控平台。这三个要素缺一不可;通过这三个要素,可以提供车辆防盗、防抢劫、行车路线监控、呼叫指挥等功能。 GPS空间部分主要由24颗GPS卫星组成,包括21颗工作卫星和3颗备用卫星。二十四颗卫星在六个轨道平面上运行,运行周期为12小时。保证在15度以上的高度角任何时间任何地点都能观测到4颗以上的卫星。 这个系统在11小时58分钟内连续围绕地球旋转,为我们提供图片和数据。虽然它有12000公里远,但它可以在地球的每个角落打洞。所以这个装备最开始是用于涉及重要国家利益的军事和民用领域,被认为价值巨大,真正是民用,完全免费。如今,GPS产品层出不穷,如GPS手机、车载GPS、GPS模块...于是,经纬度的概念被越提越高,我们在地球上空穿梭越来越容易。 GPS用户设备包括GPS接收机及相关设备。GPS接收机主要由GPS芯片组成。比如车载和船载GPS导航仪,内置GPS功能的移动设备,GPS测绘设备都属于GPS用户设备。 GPRS概念 GPRS是一种基于gsm系统的无线分组交换技术,提供端到端和广域无线ip连接。与原有的gsm拨号方式相比,gprs是一种分组交换技术,具有快速号码登录、高速免费交换和实时在线支付的优点。一般来说,GPRS是一种高速数据处理技术,以“包”的形式向用户传输资金。GPRS是从GSM网络到第三代移动通信系统的2.5代通信技术,在很多方面都有明显的优势。 GSM-GPRS在原有GSM网络的基础上增加一系列功能实体,完成分组数据功能。新增的功能实体构成了GSM-GPRS网络,绕过了CSM数据作为独立的网络实体来完成GPRS业务,而原有的GSM网络完成了语音功能,从而最大限度地减少了对CSM网络的改动。GPRS网络和GSM原有网络通过一系列接口协议共同完成移动台的移动管理功能。GPRS增加了一些功能实体:服务GPRS支持节点SCSN、网关GPRS支持节点GCSN、...

 205 |  0 |  0 Android

阿木木 | 2个月前 | 安卓优化特效UI界面Android

Android基于搞得地图实现多个目的地路径规划并在地图展示

实现效果: ![7354013950ee485c96769d5d4d2c1b5c](https://qiniu.qjos.cn/7354013950ee485c96769d5d4d2c1b5c.gif) 实现步骤 1、下载高德路径规划案例源码 这个案例是基于高德的路径规划案例写的,高德路径规划案例源码地址: https://github.com/amap-demo/android-ride-route-plan 2、去掉案例部分功能 我将用于绘制路径的RideRouteOverlay中的添加路径点和添加起始结束点的代码给去掉了,后面我们将会自定义根据需要添加Mark点。 ![a0c439d0fcab48909be74624990fdf93](https://qiniu.qjos.cn/a0c439d0fcab48909be74624990fdf93.png) 3、增加定位功能 为了显示我们当前的位置,我们需要进行定位获取,这里的定位代码中有一些其他功能的代码,我会在下面进行说明 js //开始定位 private void initLocation() {//1 定位 2 定位+开始服务 aMap.clear(); AMapLocationClient mLocationClient = new AMapLocationClient(this); AMapLocationClientOption option = new AMapLocationClientOption(); option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); option.setOnceLocation(true); mLocationClient.setLocationOption(option); mLocationClient.setLocationListener(new AMapLocationListener() { @Override pub

 240 |  1 |  0 安卓优化特效

阿木木 | 2个月前 | 特效UI界面Android

Android 实现”哀悼主题“灰白模式的思路

致敬伟人,沉痛哀悼,岁月悠长,愿尘世无灾,人间无难,山河无恙。 今天我看到很多App都设置了哀悼主题的灰白模式,比如京东、淘宝等等,如图所示: ![8fcb77a286ae4f28b759ff70cfaf22b2](https://qiniu.qjos.cn/8fcb77a286ae4f28b759ff70cfaf22b2.png) 实现的效果图: ![0d3e7f04c79c4283b0adba02feb969ef](https://qiniu.qjos.cn/0d3e7f04c79c4283b0adba02feb969ef.gif) 那我们今天就介绍三种方案全局设置灰白模式: 方案一: 这也是我回复这位童鞋的方案:给Activity的顶层View设置置灰,实现全局置灰效果,下面我们来看看具体的实现过程。 可以在BaseActivity的onCreate方法中,使用ColorMatrix设置灰度 js @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //方案一 Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0);//灰度效果 paint.setColorFilter(new ColorMatrixColorFilter(cm)); getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE,paint); } 这样就可以实现啦,这种方式还是比较简单的。 方案二: 该方法使用自定义layout,在dispatchdraw方法的时候,添加一层黑白色的bitmap,让界面开起来成为黑白模式。但是缺点明显,应用比较卡顿。 1、首先需要先定义一个GrayFrameLayout布局

 464 |  0 |  0 特效UI界面