Android shape 画虚线

一、画法

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<size android:height="1dp"/>
<stroke
android:width="3px"
android:color="#dedede"
android:dashWidth="10px"
android:dashGap="10px" />
</shape>

二、虚线不显示

这个在layout预览的时候就可以看出,不必运行到手机或者模拟器上。
原因是View的高度不大于 虚线的高度;

<View
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_gravity="center_vertical"
android:background="@drawable/comment_share_dash_line"
android:layerType="software" />

如果在标签中设置了android:width,则在标签中android:layout_height的值必须大于android:width的值,否则虚线不会显示。如果不设置,默认android:width为0。

三、虚线显示为实线

第一种解决方法:

代码中添加:

line.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

第二种解决方法:

在xml中添加

android:layerType="software"

IJKplayer 爬坑

前段时间接到一个播放视频流的需求,网上找了不少开源框架,最终发现bilibili出的ijkplayer能完美解决我的需求,由于个人是android开发,习惯使用Cywin来编译so库,在使用cywin编译ijkplayer的过程中遇到了不少的问题;于是便有了此文。

阅读更多

VirtualApk爬坑 build篇

最近公司打算重构已有项目,打算把项目插件化处理,网上找了很多资料,发现滴滴公司的VirtualApk符合我们的业务需求。
本文主要讲解构建宿主工程和插件工程中遇到的各种问题。

一、Cannot invoke method getAt() on null object

请至少添加一个宿主工程或其它插件所没有的资源文件,随意一张图片都可以
参考地址

阅读更多

abstractProcessor debug

现在APT技术已经越来越成熟了,说到APT技术肯定离不开AbstractProcessor。但是AbstractProcessor的处理是在编译层实现的,而在开发中我们往往需要debug断点调试代码;本篇文章主要介绍了如何使用AndroidStudio来进行debug调试

一、添加gradle配置

  • 对工程根目录下gradle.properties添加下面两行配置
    org.gradle.daemon=true
    org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  • 在命令行中运行gradle daemon来启动守护线程。
    gradlew --daemon
阅读更多

Android FTP 多线程断点续传下载\上传

最近在给我的开源下载框架Aria增加FTP断点续传下载和上传功能,在此过程中,爬了FTP的不少坑,终于将功能实现了,在此把一些核心功能点记录下载。

FTP下载原理

FTP单线程断点续传

FTP和传统的HTTP协议有所不同,由于FTP没有所谓的头文件,因此我们不能像HTTP那样通过设置header向服务器指定下载区间。

但是FTP协议提供了一个更好用的命令REST用于从指定位置恢复任务,同时FTP协议也提供了一个命令SIZE用于获取下载的文件大小,有了这两个命令,FTP断点续传也就没有什么问题。

FTP断点续传的原理和HTTP的断点续传原理差不多,在暂停时记录文件的停止位置,再次下载时,先读取记录的位置,如果位置存在,则通过REST命令告诉服务器从指定区间进行下载。

阅读更多

一行代码实现android文件下载

起源

本文主要介绍开源项目Aria的使用。
Aria项目源于15年工作中遇到的一个文件下载管理的需求,当时被下载折磨的痛不欲生,从那时起便萌生了编写一个简单易用,稳当高效的下载框架,aria经历了1.0到3.0的开发,算是越来越接近当初所制定的目标了。

以下为Aria的使用示例,使用Aria开发图片中的所有功能,只需要很短的时间,很少的代码。

阅读更多

列表播放视频简单实现

最近因项目需求,需要在滚动列表中播放视频。查了半天资料,发现其实现没有想象中的那么难。

原理

众所周知,由于SurfaceView没有UI同步缓冲区,就导致了在列表滚动的时候,正在播放的视频跟不上滚动的步伐;而在SDK 15的时候,谷歌官方提供了新的具有UI同步缓存的视频播放api TextureView。
本文真是基于该新Api实现。

阅读更多

记一次app进程被kill的经历

一、出现问题

最近在为河北电信做定制游戏平台开发的时候,遇到了一个很奇怪的问题,在某些盒子上,从平台打开某些游戏,玩上几分钟,然后该退出游戏,回到公司的游戏平台后,便出现了页面数据丢失的问题。
排查了几天(在这不得不吐槽电信的官僚主义,好话说尽,给予各种承诺,依然不提供可以进行adb调试的测试盒子)。最终发现是由于盒子内存太小(几年前的标准,1G内存!!!),当运行大型游戏后,盒子系统自动kill了公司的游戏平台,吐血啊。
该问题如下图所示:

阅读更多

那些年,我们爬过的坑--Andriud TV篇(一)


从去年开始,从事Android TV开发已经大半年了,期间遇到过各种各样的坑,最严重、最难解决的莫过于焦点问题。痛定思痛,决定把TV开发中遇到的各种坑一一分享出来,让更多的人不再爬我所爬过的坑。

列表焦点问题

在TV开发中,VerticalGridView是谷歌专门为Android TV适配的RecyclerView,VerticalGridView很好的解决了列表的焦点问题,但是如果使用不当,很容易出现item子项焦点错乱问题。

在TV开发中尽量尽可能不适用没有优化过的RecyclerView!!!!!

小坑—–item焦点无法获取问题

进入列表界面,我希望的是按上下左右按键,item将能取得焦点,实现放大效果,但是我的实际效果如图所示,按上下键,变成了列表上下滚动,而不是我希望实现的item放大。


阅读更多

Android多线程断点续传下载


原理

其实断点续传的原理很简单,从字面上理解,所谓断点续传就是从停止的地方重新下载。

断点:线程停止的位置。
续传:从停止的位置重新下载。
用代码解析就是:
断点 : 当前线程已经下载完成的数据长度。
续传 : 向服务器请求上次线程停止位置之后的数据。
原理知道了,功能实现起来也简单。每当线程停止时就把已下载的数据长度写入记录文件,当重新下载时,从记录文件读取已经下载了的长度。而这个长度就是所需要的断点。

续传的实现也简单,可以通过设置网络请求参数,请求服务器从指定的位置开始读取数据。
而要实现这两个功能只需要使用到httpURLconnection里面的setRequestProperty方法便可以实现.

public void setRequestProperty(String field, String newValue)

如下所示,便是向服务器请求500-1000之间的500个byte:

conn.setRequestProperty("Range", "bytes=" + 500 + "-" + 1000);

以上只是续传的一部分需求,当我们获取到下载数据时,还需要将数据写入文件,而普通发File对象并不提供从指定位置写入数据的功能,这个时候,就需要使用到RandomAccessFile来实现从指定位置给文件写入数据的功能。

public void seek(long offset)

如下所示,便是从文件的的第100个byte后开始写入数据。

raFile.seek(100);

而开始写入数据时还需要用到RandomAccessFile里面的另外一个方法

public void write(byte[] buffer, int byteOffset, int byteCount)

该方法的使用和OutputStream的write的使用一模一样…

以上便是断点续传的原理。

阅读更多

从commit一步步带你走向fragment的生命周期


Fragment 是android开发中最常用的组件之一,用了好几年,我都不知道Fragment到底是个什么东西,Activity加载Fragment的原理是怎样的,为什么官方会叫它为碎片?直到前段时间因为工作需要,从头看来一遍Fragment的源代码,然后就有了本文。

本文将从commit开始一步步带你走向Fragmnt的生命周期!!

阅读更多