自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

流月的博客

Talk is Cheap,show me the code.

  • 博客(120)
  • 资源 (18)
  • 收藏
  • 关注

原创 Socket.outputStream 是如何感知到链接断开而抛出 IOException 的

这个 send 是 bionic 库的函数,这个库中提供了网络套接字的功能,下载下来这个库,可以在库中找到这个字符串。目前不知道这个字符串是怎么传到 java 层的,可以确定的是调用底层网络库的 send 会返回错误码,可依据此来判断发生了什么错误。impl 的实现就得看 ServerSocket 是拿到的什么样的 Socket 了,看 Socket.accept() 方法。第二个判断是当 fd = -1 的时候会抛一个错,且有代码注释说明当套接字被关闭时,fd 会被设置为 -1。

2024-02-08 11:21:06 292

原创 Android SDK 上传 Maven 喂奶级教程

最近领导给安排了个任务,让我把我们现有的一个 SDK 上传到 Maven 上去,方便客户直接用 gradle 依赖,不再需要拷贝 jar 和 so 了,此前我也看过一些相关的文章我想问题也不大,觉得工作量也就一两天的事情,主要的难点在于如何隐藏源码上传 maven(因为是商业 SDK),万万没想到问题这么多,网上有用的文章也很少,加上 gradle 的版本捣捣乱让我整整一周焦头烂额,一言难尽,略过,直接进入正题!

2024-02-08 11:18:27 1616

原创 1024 创作者节,奖金多多,直通 offer ~

1024 创作者节,奖金多多,直通 offer ~

2023-10-12 17:32:51 233

原创 程序员的哲思录

在此记录一些自己觉得有道理的语句或随想 有时候体制的创新或者制度的变革比建立技术护城河重要的多。 一想到为人父母不需要经过考试就觉得很可怕,很多父母并不知道如何为人父母,只是自私自利,冠冕堂皇罢了。 每天7点半准时坐在电视前,幸福感以方程式增长。 如果一个人的认知远远超过他的能力就会变得浮躁。 你懂的越多,懂你的人越少。 美貌十分肤浅,如...

2019-08-14 09:08:02 974

原创 Android OpenGl学习(一)

最近由于项目需要,所以开始学习OpenGL,网络上的东西零零散散,所以就想写一系列博客来记录学习OpenGL。一、简介首先我们要对其有一个简单的认识什么是OpenGL?官方描述:OpenGL是一个跨平台的图形API,用于指定3D图形处理硬件中的标准软件接口。OpenGL的优势?OpenGl是用来做图像处理的,那我们为什么不使用Canvas呢?费劲学这个干嘛?答案很简单,...

2019-07-29 17:42:49 1406 4

原创 Git基础操作

一、流程与概念首先在使用git之前我们需要了解它的几个概念和基础使用流程,在git操作中有四个重要的地方,你所有的操作都是在和他们打交道。workspace : 工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。 index : 暂存区 , 一个本地的缓冲区。暂存区域是一个文件,保存了下次将提交的文件列表信息,一般...

2019-07-28 19:18:39 474

原创 Git踩坑指南

最近入职了七牛云,因为安全性的原因,加入github上的开发小组必须开启二次验证,今天想上传一个新的demo代码,搞了半天老是说我账号密码不对,RSA也不行,经过多次重试并且之前也使用git,所以我确定我的操作没有错,问题就在账号的二次验证上,经过一番曲折,终于搞定了,所以决定写下一篇博客作为记录,也为了他人遇到此问题快速查找解决方式,避免浪费时间。此博客会不断更新,作为一个git错误解决方式的集...

2019-07-28 16:17:50 514

原创 【精选】JAVA算法题(二十五)

好长时间没有写博客了,之前因为期末考试耽误了一段时间,回家又玩了几天,然后又赶来上海入职,所以就把博客这事给忘了,哈哈,懒惰啊。一、最长回文字符串题目:/** * 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 * 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。 * <p> * 注意: * 假设字符串的...

2019-07-21 17:26:48 401 1

原创 Bitmap总结

相信大家在平时的android开发中肯定用过Bitmap,而且用的还不少,那么你对它有足够的了解吗?你的使用高效吗?对于超大图片是如何处理的呢?下面就让我们一起来从基础学习一下Bitmap。一、Bitmap是什么?位图(Bitmap),又称栅格图或点阵图,是使用像素阵列来表示的图像。位图(Bitmap)也可指: 一种数据结构,代表了有限域中的稠集,每一个元素至少出现一次,没有其他...

2019-06-10 14:49:03 794

原创 Binder机制总结

在android中进行跨进程通信通常有以下几种方式:使用Intent 使用文件共享 使用Messenger 使用AIDL 使用ContentProvider其中Intent中可以携带Bundle,而Bundle实现了Parcelable接口,所以可以在不同的进程间进行传输。文件共享就是读写文件,比如常用的SharedPreferences就是以XML来存储的文件。而Messenger...

2019-06-03 10:04:39 3146

原创 【精选】JAVA算法题(二十四)

一、子字符串出现的位置题目:/*** 给出 字符串 text 和 字符串列表 words, 返回所有的索引对 [i, j] 使得在索引对范围内的子字符串* text[i]...text[j](包括 i 和 j)属于字符串列表 words。** 示例 1:* 输入: text = "thestoryofleetcodeandme", words = ["story","f...

2019-06-02 17:44:31 581

原创 【精选】JAVA算法题(二十三)

一、完全平方数题目:/** *给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。 * 说明:不要使用任何内置的库函数,如 sqrt。 * * 示例 1: * 输入:16 * 输出:True * * 示例 2: * 输入:14 * 输出:False */不使用库函数来判断一个数是不是一个完全平方数-...

2019-06-02 16:47:08 596

原创 【精选】JAVA算法题(二十二)

一、两数之和题目:/** * 不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。 * * 示例 1: * 输入: a = 1, b = 2 * 输出: 3 * * 示例 2: * 输入: a = -2, b = 3 * 输出: 1 */这道题的本意其实就是在考你的位运算,如何利用位运算来进行数的加减可以分为两...

2019-05-30 20:45:03 390

原创 View的onMeasure()、onLayout()、onDraw()总结

自定义View是android开发中常有的一项工作,要想自定义View,你就必须熟练掌握View的测量、布局及绘制,了解其原理并会使用。View视图绘制需要搞清楚两个问题,一个是从哪里开始绘制,一个是怎么绘制?先说从哪里开始绘制的问题:我们平常在使用Activity的时候,都会调用setContentView来设置布局文件,没错,视图绘制就是从这个方法开始的;再来说说怎么绘制的:在...

2019-05-30 10:14:00 5549

原创 【精选】JAVA算法题(二十一)

一、丑数题目:/** * 编写一个程序判断给定的数是否为丑数。 * 丑数就是只包含质因数 2, 3, 5 的正整数。 * * 示例 1: * 输入: 6 * 输出: true * 解释: 6 = 2 × 3 * * 示例 2: * 输入: 8 * 输出: true * 解释: 8 = 2 × 2 × 2 * * 示例 3: * 输入: 14 * 输出: ...

2019-05-23 11:31:03 277

原创 【精选】JAVA算法题(二十)

一、异位词题目:/** * 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。 * * 示例 1: * 输入: s = "anagram", t = "nagaram" * 输出: true * * 示例 2: * 输入: s = "rat", t = "car" * 输出: false * * 说明: * 你可以假设字符串只包...

2019-05-22 21:11:51 324

原创 【精选】JAVA算法题(十九)

一、重复的数题目:/** * 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j, * 使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。 * * 示例 1: * 输入: nums = [1,2,3,1], k = 3 * 输出: true * * 示例 2: * 输入: nums = [1,0,1,1]...

2019-05-22 20:40:49 1078

原创 【精选】JAVA算法题(十八)

一、移除链表中指定的节点题目:/** * 删除链表中等于给定值 val 的所有节点。 * * 示例: * 输入: 1->2->6->3->4->5->6, val = 6 * 输出: 1->2->3->4->5 */题的描述很简单,做起来并不容易,有一些小坑,要注意的就是头尾的节点的处理和连续相等的情况处理,...

2019-05-22 15:14:20 552

原创 【精选】JAVA算法题(十七)

一、镜面反射题目:/** * 有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2。 * 正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。 * 返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。 */ 示例:输入: p = 2, q...

2019-05-09 20:54:57 386

原创 贝尔曼-福德算法

我在上一篇博客中讲解了狄克斯特拉算法,该算法可以用于寻找权值都为正的有向无环图的最短路径,我也提到了如果碰到权值为负的情况可以使用贝尔曼-福德算法,那么今天就让我们学习一下贝尔曼-福德算法是如何处理负权值和环路的。其实理解了狄克斯特拉算法之后理解贝尔曼-福德算法就很容易了,如果说狄克斯特拉算法是用一种“广度”的方式,每次寻找源点所能到达的距离最短的一个点,更新其邻居节点的距离。那么贝尔曼-福德...

2019-05-03 20:26:07 6477

原创 狄克斯特拉算法

一、介绍在前一篇博客中我们学习了广度优先搜索算法,它解决的是段数最少的路径,如果你要找到最快的路径,该怎么办呢?为此,可以使用本篇博客所讲述的算法——狄克斯特拉算法如果你使用广度优先搜索,将得到下面这条段数最少的路径。这条路径耗时7分钟。下面来看看能否找到耗时更短的路径!狄克斯特拉算法包含4个步骤。(1) 找出“最便宜”的节点,即可在最短时间内到达的节点。(2) 更新该节点...

2019-04-26 13:42:08 2672

原创 广度优先搜索算法

一、简介广度优先搜索算法(Breadth-First Search,BFS)是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。广度优先搜索让你能够找出两样东西之间的最短距离,不过最短距离的含义有很多!使用广度优先搜索可以:编写国际跳棋AI,计算最少走多少步就可获胜; ...

2019-04-25 13:26:58 127703 27

原创 【精选】JAVA算法题(十六)

1.脏矩形合并题目: 在2D渲染系统中,局部渲染是常见提升渲染性能的方法。如果界面中有元素发生了改变,我们可以将这个元素所占矩形区域标记为脏矩形,那么在接下来的渲染中,我们仅对每个脏矩形所占矩形区域执行一次局部渲染即可,无需渲染全屏。 但系统提供的局部渲染API有如下限制: 1. 单次局部渲染区域必需是矩形,不能是多边形,圆形或者其他不规则形状。 2. 单次局部渲染时间开销除了和...

2019-04-20 22:13:46 455 3

原创 Activity、Window、DecorView、ViewRootImpl之间的关系

我们通常写Activity的时候在onCreate里面都会写上setContentView()这一步,该方法会将你指定的布局文件加载并显示到屏幕中,在其中会经历一系列操作,其中也就涉及到了Activity,Window,DecorView,ViewRootImpl,今天就让我们借助这个方法来看看这些对象之间的关系。如果你在5.0之前就开始学习android了,那你会发现一个Activity的改...

2019-04-20 12:17:42 943

原创 LruCache和DiskCache总结

日常我们写程序的时候经常会使用到网络的图片,如果我们每次都去网上加载,那么性能难免会差一些,并且网络情况并不是总是 那么好,那么这时候我们就需要使用缓存了,我们学习android都知道图片的三级缓存,分别是内存缓存,硬盘缓存,网络缓存。它的大体流程是这样的,给定一个网址,加载一张图片如果内存缓存中存在,那就取出来,放上去,如果没有就找硬盘缓存 如果硬盘缓存中存在,那就取出来,放上去,并添...

2019-04-10 11:38:53 864

原创 IntentService总结

我们平常写程序时经常会涉及到下载或者播放音乐等耗时操作,你可能会使用Service+Thread的方式解决,但是这样比较麻烦,如果你要串行执行多个耗时操作还要使用线程池,其实Google早就帮我们封装好了一个框架——IntentService一、简单使用Client端public class ClientActivity extends AppCompatActivity { ...

2019-04-09 18:23:52 219

原创 HandlerThread总结

在Android系统中,执行耗时操作必须使用子线程来执行,执行完线程以后线程便会自动销毁。但是如果如果我们有很多分步的耗时操作,如果我们不断的创建新的线程执行,不断销毁线程便会消耗很多的性能,那么该怎么办呢?android给我们提供了两个方法,一个就是使用本篇文章讲的HandlerThread,另一个便是使用线程池管理线程。一、简单使用1.创建实例对象//参数表示线程名称Handl...

2019-04-09 16:49:14 825

原创 AsyncTask总结

AsyncTask是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。一、简介1.AsyncTask的泛型参数public abstract class AsyncTask<Params, Progress, Result>其中,三个...

2019-04-09 10:54:54 255

原创 滑动冲突解决方式总结

一、冲突类型滑动冲突分为三种类型,第一类是外部和内部滑动方向不一致,第二类是外部和内部滑动方向一致,第三类是前两种嵌套的模式。处理这三种类型的规则分为两类,对于第一种类型,我们可以根据滑动方向来处理,符合处理方向的分配给对应的控件;对于2、3种类型,必须根据业务上的区别来处理,某种状态的处理事件分发给对应的控件来处理。对于滑动方向的判别通常使用以下方式,使用终点坐标和起点坐标,计...

2019-04-08 18:49:14 3142 2

原创 事件分发总结

一、基础知识1.分发对象事件:Touch事件相关细节(发生触摸的位置、时间、历史记录、手势动作等)被封装成MotionEvent对象2.事件主要发生的Touch事件大致分为以下四种: MotionEvent.ACTION_DOWN:按下事件(所有事件的开始) MotionEvent.ACTION_MOVE:滑动事件 MotionEvent.ACTION_C...

2019-04-08 17:16:05 2265

原创 消息机制总结

因为android的UI线程不是线程安全的,所以更新视图只能在主线程更新,那么如果我的子线程想要更新UI该怎么办呢?这就是 Handler出现的原因了,虽然我们通常将Handler用在子线程需要更新UI的场景下,也可以用来传递消息。一、角色分析1、Handler:处理器,负责的内容是消息的发送和具体处理流程,一般使用时由开发者重写handleMessage函数,根据自定义的不同messag...

2019-04-08 11:40:19 2027

原创 Fragment总结(二)

四、Fragment与Activity通信1.在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作2.Handler、EventBuspublic class MainActivity extends FragmentActivity{ //声明一个Handler public Handler mHandler ...

2019-04-07 20:50:27 544

原创 Fragment总结(一)

我们日常开发中经常会使用到fragment,通常会放置在主页面上,方便切换展示信息。它拥有自己的生命周期,可以接受处理用户的事件,并且你可以在一个Activity中动态的添加,替换,移除不同的Fragment。一、生命周期第一张图展示了fragment的生命周期,第二章图展示了 Activity 与 Fragment 生命周期的对比Fragment比Activity多了几个生命周期...

2019-04-07 19:48:00 564

原创 BroadcastReceiver总结

BroadcastReceiver属于Android四大组件之一可用于监听应用发出的广播消息,并做出相应应用场景 :不同组件之间通信(包括应用内 / 不同应用之间) 与Android系统在特定情况下的通信 如当电话呼入时、网络可用时 多线程通信一、实现原理使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。 广播接收者 通过Binder机制在...

2019-04-07 16:28:00 368

原创 Service总结

一、Service种类按运行地点分类:本地服务:运行在主进程中 远程服务:运行在独立的进程中按运行类型分类:前台服务:会有通知栏显示 后台服务:默认的服务,没有通知栏显示按启动方式分类:startService启动:停止使用stopService bindService启动:停止使用unbindService 使用startService和bindService启动:同...

2019-04-06 17:24:28 602

原创 JAVA入门算法题(十五)

一、满二叉搜索树/** * 给定一个二叉树的层序遍历判断是不是一颗满二叉搜索树 */大致分为这么几步:1.处理输入2.根据满二叉树的节点数量进行排除3.构建树4.递归判断 public static Node root; public static void isManTree(){ Scanner sc = new Scann...

2019-04-06 13:13:22 286

原创 教你用JAVA写个小游戏

上周上课的时候老师让用Java写个小程序,我本想写一个经典的飞机大战游戏来着,可以后来突发奇想就写成了这个一、整体思路继承窗体类,复写窗体刷新 添加按键监听 游戏结束界面 王思聪类和热狗类 移动轨迹计算 判断碰撞 音乐播放 不断刷新窗体 处理细节二、编码1.图片首先你要找到图片,可以百度一张,然后用ps切开,再找一张背景图片就搞定了你还需要一个加载图片的...

2019-04-03 10:54:07 101439 35

原创 Activity总结

一、Activity的生命周期activity应该是我们初学android就接触的,而它的生命周期更是重中之重,掌握activity的生命周期也是学好android的基础这张图片可谓是非常经典,应该学习android的人都见过,下面讲一一讲解各个方法:(1) onCreate():在activity创建时会被调用,通常会在其中加载布局,初始化控件。(2) onRestart()...

2019-04-01 21:53:04 442

原创 JAVA入门算法题(十四)

一、最小的淘气值题目:/** * 老师要给学生安排座位,经统计教室有N个双人桌,M名学生,每个学生有一个淘气值, * 要合理安排座位,使得班内同桌之和的淘气值最大值尽可能的小,输出最小值。 */这是一道360Android春招笔试题要考虑这样的几种情况:1.座位数>=学生数,那么就每个人做一个桌子,最大的淘气值就是最淘气的那个学生2.座位数刚好坐满,那么...

2019-03-31 16:24:19 545

原创 JAVA入门算法题(十三)

一、出现一次的数题目:/** * 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 * 说明: * 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? * 示例 1: * 输入: [2,2,1] * 输出: 1 * 示例 2: * 输入: [4,1,2,1,2] * 输出: 4 */看完题便...

2019-03-31 15:38:20 260

思聪吃热狗

用java写的一个小游戏,日常练习用的,仅供参考。使用awt,挺有意思的

2019-04-03

程序猿表白代码

内容包含从网络收集的多种表白代码,玫瑰花网页,表白网页,vb小程序

2018-11-24

JAVA Socket远程执行任务

写的一个关于socket的例子,实现了客户端和服务器端的简单交互,客户端给服务端发送命令和jar包由服务端执行后返回结果

2018-11-21

Android动画详解

这是我学习动画时自己写的一些例子,很全,包括补间动画、逐帧动画、属性动画,还有一些自定义动画

2018-10-11

Android属性动画超全超详细

写的一个非常全面非常详细的Android属性动画例子,包含各种创建方式和使用方式

2018-10-09

AlertDialog常用对话框

AlertDialog常用创建方式,共演示了五种创建方式,每种都有注释。

2018-10-05

python爬虫程序集合

里面大概有4个爬虫程序吧,有爬取google,有百度的,有bing的,拿去参考,希望对你的学习有帮助

2018-09-03

python入门程序集合

学习python时写的一些小程序,里面大约有几十个类,都是一些基础的知识,对初学者有很大帮助

2018-09-02

QQ聊天机器人

public class MainActivity extends Activity { /** * 展示消息的listview */ private ListView mChatView; /** * 文本域 */ private EditText mMsg; /** * 存储聊天消息 */ private List<ChatMessage> mDatas = new ArrayList<ChatMessage>(); /** * 适配器 */ private ChatMessageAdapter mAdapter; private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { ChatMessage from = (ChatMessage) msg.obj; mDatas.add(from); mAdapter.notifyDataSetChanged(); mChatView.setSelection(mDatas.size() - 1); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main_chatting); initView(); mAdapter = new ChatMessageAdapter(this, mDatas); mChatView.setAdapter(mAdapter); } private void initView() { mChatView = (ListView) findViewById(R.id.id_chat_listView); mMsg = (EditText) findViewById(R.id.id_chat_msg); mDatas.add(new ChatMessage(ChatMessage.Type.INPUT, "我是小跟班,很高兴为您服务")); } public void sendMessage(View view) { final String msg = mMsg.getText().toString(); if (TextUtils.isEmpty(msg)) { Toast.makeText(this, "您还没有填写信息呢...", Toast.LENGTH_SHORT).show(); return; } ChatMessage to = new ChatMessage(ChatMessage.Type.OUTPUT, msg); to.setDate(new Date()); mDatas.add(to); mAdapter.notifyDataSetChanged(); mChatView.setSelection(mDatas.size() - 1); mMsg.setText(""); // 关闭软键盘 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // 得到InputMethodManager的实例 if (imm.isActive()) { // 如果开启 imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS); // 关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的 } new Thread() { public void run() { ChatMessage from = null; try { from = HttpUtils.sendMsg(msg); } catch (Exception e) { from = new ChatMessage(ChatMessage.Type.INPUT, "服务器挂了呢..."); } Message message = Message.obtain(); message.obj = from; mHandler.sendMessage(message); }; }.start(); } }

2017-09-25

仿QQ气泡拖动删除

private RelativeLayout root; private BounceCircle messageCount; private BounceCircle contactCount; private ImageView messageIcon; private ImageView contactIcon; private int radius = 40; // 圆形半径 private boolean init = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); root = (RelativeLayout) findViewById(R.id.activity_main); messageIcon = (ImageView) findViewById(R.id.message_icon); contactIcon = (ImageView) findViewById(R.id.contact_icon); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); // 只需执行一次,在onWindowFocusChanged方法中才能获取到控件在屏幕中的坐标 if (init) { init =false; int[] position = new int[2]; messageIcon.getLocationOnScreen(position); messageCount = new BounceCircle(this, radius, position[0] + messageIcon.getWidth(), (position[1] - Util.getTopBarHeight(this))); messageCount.setNumber("20"); messageCount.setFinishListener(new BounceCircle.FinishListener() { @Override public void onFinish() { Toast.makeText(MainActivity.this, "message count dismiss", Toast.LENGTH_LONG).show(); } }); root.addView(messageCount); contactIcon.getLocationOnScreen(position); contactCount = new BounceCircle(this, radius, position[0] + contactIcon.getWidth(), (position[1] - Util.getTopBarHeight(this))); contactCount.setNumber("30"); contactCount.setFinishListener(new BounceCircle.FinishListener() { @Override public void onFinish() { Toast.makeText(MainActivity.this, "contract count dismiss", Toast.LENGTH_LONG).show(); } }); root.addView(contactCount); } }

2017-09-25

各类监听合集

Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); Object month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); Log.e("time_now", ""+year+"_"+month+1+"_"+day+"_"+hour+"_"+minute); SimpleDateFormat formatter = new SimpleDateFormat ("yyyy年MM月dd日 HH:mm:ss"); Date curDate = new Date(System.currentTimeMillis()); String str10 = formatter.format(curDate); Log.e("time_now1",""+str10); long time=System.currentTimeMillis(); Log.e("time_now2", ""+time); TextView textview1 = (TextView)findViewById(R.id.textview1); textview1.setAutoLinkMask(Linkify.ALL); String linktext = "百度链接 www.baidu.com"; textview1.setText(linktext); //AutoCompleteTextView AutoCompleteTextView autv_1 = (AutoCompleteTextView)findViewById(R.id.autv_1); String[] str = {"ab","abc","abcd"}; ArrayAdapter<String> stringArrayAdapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,str); autv_1.setAdapter(stringArrayAdapter); //Button 点击 Button btn_1 = (Button)findViewById(R.id.btn_1); btn_1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "按钮点击监听", Toast.LENGTH_SHORT).show(); } });

2017-09-25

导出Excel文件

public class MainActivity extends AppCompatActivity { private List<ExcelData> listExcelData=new ArrayList<ExcelData>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addDate(); } private void addDate(){ ExcelData data1=new ExcelData("张三", "19","数学","男","大一","123"); ExcelData data2=new ExcelData("李四", "20","语文","女","大二","456"); ExcelData data3=new ExcelData("王五", "21","英语","不明","大三","789"); ExcelData data4=new ExcelData("赵六", "22","化学","不明","大四","135"); ExcelData data5=new ExcelData("阿七", "23","生物","不明","大五","246"); ExcelData data6=new ExcelData("傻八", "24","物理","不明","大六","159"); listExcelData.add(data1); listExcelData.add(data2); listExcelData.add(data3); listExcelData.add(data4); listExcelData.add(data5); listExcelData.add(data6); } public void createExcel(View v) throws FileNotFoundException { File file; File dir = new File(Environment.getExternalStorageDirectory().toString()); Log.e("飞","路径是:"+dir.getAbsolutePath()); file=new File(Environment.getExternalStorageDirectory(),"excel.xls"); if (!dir.exists()){ Log.e("飞","创建文件夹"); dir.mkdirs(); } WritableWorkbook wwb; OutputStream os= null; os = new FileOutputStream(file);

2017-09-25

数据存储练习

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 测试sp存储 public void onClickSP(View v) { startActivity(new Intent(this, SpActivity.class)); } // 测试手机内部文件存储 public void onClickIF(View v) { startActivity(new Intent(this, IFActivity.class)); } // 测试手机外部文件存储 public void onClickOF(View v) { startActivity(new Intent(this, OFActivity.class)); } // 测试Sqlite数据库存储 public void onClickDB(View v) { startActivity(new Intent(this, DBActivity.class)); } public void onClickNW(View v) { startActivity(new Intent(this, NetworkActivity.class)); } }

2017-09-25

简易相机练习

简易相机用以练习 private SurfaceView surface; private Button shutter,position,back;//快门 private SurfaceHolder holder; private Camera camera;//声明相机 private String filepath = "";//照片保存路径 private int cameraPosition = 1;//0代表前置摄像头,1代表后置摄像头 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//没有标题 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏 this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//拍照过程屏幕一直处于高亮 //设置手机屏幕朝向,一共有7种 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); //SCREEN_ORIENTATION_BEHIND: 继承Activity堆栈中当前Activity下面的那个Activity的方向 //SCREEN_ORIENTATION_LANDSCAPE: 横屏(风景照) ,显示时宽度大于高度 //SCREEN_ORIENTATION_PORTRAIT: 竖屏 (肖像照) , 显示时高度大于宽度 //SCREEN_ORIENTATION_SENSOR 由重力感应器来决定屏幕的朝向,它取决于用户如何持有设备,当设备被旋转时方向会随之在横屏与竖屏之间变化 //SCREEN_ORIENTATION_NOSENSOR: 忽略物理感应器——即显示方向与物理感应器无关,不管用户如何旋转设备显示方向都不会随着改变("unspecified"设置除外) //SCREEN_ORIENTATION_UNSPECIFIED: 未指定,此为默认值,由Android系统自己选择适当的方向,选择策略视具体设备的配置情况而定,因此不同的设备会有不同的方向选择 //SCREEN_ORIENTATION_USER: 用户当前的首选方向 setContentView(R.layout.activity_main); back = (Button) findViewById(R.id.camera_back); position = (Button) findViewById(R.id.camera_position); surface = (SurfaceView) findViewById(R.id.camera_surface); shutter = (Button) findViewById(R.id.camera_shutter); holder = surface.getHolder();//获得句柄 holder.addCallback(this);//添加回调 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//surfaceview不维护自己的缓冲区,等待屏幕渲染引擎将内容推送到用户面前 //设置监听 back.setOnClickListener(listener); position.setOnClickListener(listener); shutter.setOnClickListener(listener);

2017-09-25

贝塞尔曲线

从2阶到7阶的贝赛尔曲线 private static final int MAX_COUNT = 7; // 贝塞尔曲线最大阶数 private static final int REGION_WIDTH = 30; // 合法区域宽度 private static final int FINGER_RECT_SIZE = 60; // 矩形尺寸 private static final int BEZIER_WIDTH = 10; // 贝塞尔曲线线宽 private static final int TANGENT_WIDTH = 6; // 切线线宽 private static final int CONTROL_WIDTH = 12; // 控制点连线线宽 private static final int CONTROL_RADIUS = 12; // 控制点半径 private static final int TEXT_SIZE = 40; // 文字画笔尺寸 private static final int TEXT_HEIGHT = 60; // 文本高度 private static final int RATE = 10; // 移动速率 private static final int HANDLER_WHAT = 100; private static final int FRAME = 1000; // 1000帧 private static final String[] TANGENT_COLORS = {"#7fff00", "#7a67ee", "#ee82ee", "#ffd700", "#1c86ee", "#8b8b00"}; // 切线颜色 private static final int STATE_READY = 0x0001; private static final int STATE_RUNNING = 0x0002; private static final int STATE_STOP = 0x0004; private static final int STATE_TOUCH = 0x0010; private Path mBezierPath = null; // 贝塞尔曲线路径 private Paint mBezierPaint = null; // 贝塞尔曲线画笔 private Paint mMovingPaint = null; // 移动点画笔 private Paint mControlPaint = null; // 控制点画笔 private Paint mTangentPaint = null; // 切线画笔 private Paint mLinePaint = null; // 固定线画笔 private Paint mTextPointPaint = null; // 点画笔 private Paint mTextPaint = null; // 文字画笔 private ArrayList mBezierPoints = null; // 贝塞尔曲线点集 private PointF mBezierPoint = null; // 贝塞尔曲线移动点 private ArrayList mControlPoints = null; // 控制点集 private ArrayList<ArrayList<ArrayList>> mTangentPoints; // 切线点集 private ArrayList<ArrayList> mInstantTangentPoints; private int mR = 0; // 移动速率 private int mRate = RATE; // 速率 private int mState; // 状态 private boolean mLoop = false; // 设置是否循环 private boolean mTangent = true; // 设置是否显示切线 private int mWidth = 0, mHe

2017-09-25

安卓属性动画

安卓几种属性动画 rotateButton = (Button)findViewById(R.id.rotateButton); scaleButton = (Button)findViewById(R.id.scaleButton); alphaButton = (Button)findViewById(R.id.alphaButton); translateButton = (Button)findViewById(R.id.translateButton); image1 = (ImageView)findViewById(R.id.image1); image2 = (ImageView)findViewById(R.id.image2); image3 = (ImageView)findViewById(R.id.image3); image4 = (ImageView)findViewById(R.id.image4); image5 = (ImageView)findViewById(R.id.image5); rotateButton.setOnClickListener(new RotateButtonListener()); scaleButton.setOnClickListener(new ScaleButtonListener()); alphaButton.setOnClickListener(new AlphaButtonListener()); translateButton.setOnClickListener(new TranslateButtonListener()); } class AlphaButtonListener implements View.OnClickListener { public void onClick(View v) { //创建一个AnimationSet对象,参数为Boolean型, //true表示使用Animation的interpolator,false则是使用自己的 AnimationSet animationSet = new AnimationSet(true); //创建一个AlphaAnimation对象,参数从完全的透明度,到完全的不透明 AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); //设置动画执行的时间 alphaAnimation.setDuration(2000); //将alphaAnimation对象添加到AnimationSet当中 animationSet.addAnimation(alphaAnimation); //使用ImageView的startAnimation方法执行动画 image1.startAnimation(animationSet); image2.startAnimation(animationSet); image3.startAnimation(animationSet); image4.startAnimation(animationSet); image5.startAnimation(animationSet); Toast.makeText(getApplicationContext(),"消失吧!",Toast.LENGTH_SHORT).show(); } }

2017-09-25

2048游戏源码

2048游戏源码 /** * 检测当前所有的位置都有数字,且相邻的没有相同的数字 * * @return */ private boolean checkOver() { // 检测是否所有位置都有数字 if (!isFull()) { return false; } for (int i = 0; i < mColumn; i++) { for (int j = 0; j < mColumn; j++) { int index = i * mColumn + j; // 当前的Item Game2048Item item = mGame2048Items[index]; // 右边 if ((index + 1) % mColumn != 0) { Log.e("TAG", "RIGHT"); // 右边的Item Game2048Item itemRight = mGame2048Items[index + 1]; if (item.getNumber() == itemRight.getNumber()) return false; } // 下边 if ((index + mColumn) < mColumn * mColumn) { Log.e("TAG", "DOWN"); Game2048Item itemBottom = mGame2048Items[index + mColumn]; if (item.getNumber() == itemBottom.getNumber()) return false; } // 左边 if (index % mColumn != 0) { Log.e("TAG", "LEFT"); Game2048Item itemLeft = mGame2048Items[index - 1]; if (itemLeft.getNumber() == item.getNumber()) return false; } // 上边 if (index + 1 > mColumn) { Log.e("TAG", "UP"); Game2048Item itemTop = mGame2048Items[index - mColumn]; if (item.getNumber() == itemTop.getNumber()) return false; } } } return true; }

2017-09-25

天气查询APP,Json解析,3种方式

天气查询APP,两种JSON解析方式 /** * 原始json数据解析 * */ // JSONObject jsonObject = new JSONObject(res); // String reason=jsonObject.getString("reason"); // if (reason.equals("参数不正确")){ // handler.sendEmptyMessage(1); // return; // } // JSONObject result=jsonObject.getJSONObject("result"); // JSONObject realtime=result.getJSONObject("realtime"); // JSONObject life=result.getJSONObject("life"); // JSONObject wind=realtime.getJSONObject("wind"); // String time=realtime.getString("time"); // JSONObject weather=realtime.getJSONObject("weather"); // String date=realtime.getString("date"); // dateStr=time+date; // weekStr=realtime.getString("week"); // calendarStr=realtime.getString("moon"); // windpowerStr=wind.getString("direct")+" "+wind.getString("power"); // weatherStr=weather.getString("info"); // temperatureStr=weather.getString("temperature"); // JSONObject info=life.getJSONObject("info"); // JSONArray kongtiao=info.getJSONArray("kongtiao"); // JSONArray yundong=info.getJSONArray("yundong"); // JSONArray ziwaixian=info.getJSONArray("ziwaixian"); // ACStr=kongtiao.getString(0)+" "+kongtiao.getString(1); // sportStr=yundong.getString(0)+" "+yundong.getString(1); // lightStr=ziwaixian.getString(0)+" "+ziwaixian.getString(1); /** * Gson数据解析 */ WheatherBean wheatherBean=new Gson().fromJson(res,WheatherBean.class); String reason=wheatherBean.getReason(); if (reason.equals("参数不正确")){ handler.sendEmptyMessage(1); return; } WheatherBean.ResultBean resultBean=wheatherBean.getResult(); WheatherBean.ResultBean.RealtimeBean realtimeBean=resultBean.getRealtime(); WheatherBean.ResultBean.RealtimeBean.WindBean windBean=realtimeBean.getWind(); String time=realtimeBean.getTime(); WheatherBean.ResultBean.RealtimeBean.WeatherBean weatherBean=realtimeBean.getWeather(); String date=realtimeBean.getDate(); dateStr=time+date; weekStr=realtimeBean.getWeek(); calendarStr=realtimeBean.getMoon(); windpowerStr=windBean.getDirect()+" "+windBean.getPower(); temperatureStr=weatherBean.getTemperature(); weatherStr=weatherBean.getInfo(); WheatherBean.ResultBean.LifeBean lifeBean=resultBean.getLife(); WheatherBean.ResultBean.LifeBean.InfoBean infoBean=lifeBean.getInfo(); List<String> kongtiao=infoBean.getKongtiao(); List<String> yundong=infoBean.getYundong(); List<String> ziwaixian=infoBean.getZiwaixian(); ACStr=kongtiao.get(0)+" "+kongtiao.get(1); sportStr=yundong.get(0)+" "+yundong.get(1); lightStr=ziwaixian.get(0)+" "+ziwaixian.get(1); }

2017-09-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除