<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[stonezry的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/stonezry</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; stonezry]]></copyright><item><title><![CDATA[kotlin运行]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/135544342</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/135544342</guid><author>stonezry</author><pubDate>Fri, 12 Jan 2024 09:36:25 +0800</pubDate><description><![CDATA[由于我本身是做android的，android studio本身有内置kotlin的插件。但若只是想跑kotlin的程序，并不像和android程序绑在一起，可以创建一个kt文件，在里面写一个main函数，就可以直接运行kotlin程序。还有一种方式是使用使用IntelliJ IDEA，不过我没啥兴趣用这个软件，就不介绍了。1.使用android studio。2、在线运行Kotlin代码。]]></description><category></category></item><item><title><![CDATA[android属性动画]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/107181990</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/107181990</guid><author>stonezry</author><pubDate>Mon, 13 Jul 2020 11:13:11 +0800</pubDate><description><![CDATA[属性动画的本质原理就是通过不断对值进行改变，并不断将该值赋给对象的属性，从而实现该对象在该属性上的动画效果。
流程原理图如下（网络上找的）：

从上图可以知道属性动画分类大致又可以分为ValueAnimator，ObjectAnimator。
ValueAnimator
//设置参数：开始值0和结束值360，表示你要从哪个值到哪个值进行变化（旋转角度）
val valueAnimator = ValueAnimator.ofFloat(0f, 360f)
//这里是设置动画执行时间，毫秒
valueAnim]]></description><category></category></item><item><title><![CDATA[android传统动画：帧动画和补间动画]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/107101063</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/107101063</guid><author>stonezry</author><pubDate>Fri, 03 Jul 2020 16:44:17 +0800</pubDate><description><![CDATA[现在android一般分为属性动画和传统动画。
而传统动画有分为帧动画和补间动画。今天就来了解下这两个，就当做个笔记。
帧动画
帧动画有点其实就是类似gif的动画，用一张一张的图片叠加产生的动画，不过缺点也是很明显的，如果每张图片都很大，就很影响性能。所以现在其实比较少用了。
帧动画的使用也很简单，这里准备三张图片。
然后加入xml资源文件。
animation_frame_play.xml
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;animation]]></description><category></category></item><item><title><![CDATA[recyclerview实现加载更多]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/107098472</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/107098472</guid><author>stonezry</author><pubDate>Fri, 03 Jul 2020 09:23:56 +0800</pubDate><description><![CDATA[这里并没有重写recyclerview，只是对adapter进行了封装。
封装的adapter
/**
 *
 * @fuction recycleview 加载更多用的adpter
 * @date 2018/9/15
 * @author zhou
 */
abstract class RVLoadMoreAdapter&lt;T&gt;(
    protected var mContext: Context,
    private val recyclerView: RecyclerView,
 ]]></description><category></category></item><item><title><![CDATA[recyclerview的adapter封装（kotlin）]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/107064775</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/107064775</guid><author>stonezry</author><pubDate>Wed, 01 Jul 2020 16:02:11 +0800</pubDate><description><![CDATA[首先是重写 ViewHolder，参考了鸿洋大神的博客。
class RViewHolder(private val mContext: Context, val convertView: View) : ViewHolder(convertView) {

    private val mViews: SparseArray&lt;View&gt;

    init {
        mViews = SparseArray()
    }

    /**
     * 通过viewId获取控件
]]></description><category></category></item><item><title><![CDATA[android防止连续点击的简单实现（kotlin）]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/107041010</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/107041010</guid><author>stonezry</author><pubDate>Tue, 30 Jun 2020 14:01:47 +0800</pubDate><description><![CDATA[首先 方法类：
package com.zhou.base.utils

/**
 * Created by zhou on 17/3/20.
 */
object ToolsUtil {
    //防止连续点击
    /** 判断是否是快速点击  */
    private var lastClickTime: Long = 0
    val isFastDoubleClick: Boolean
        get() {
            val time = System.curre]]></description><category></category></item><item><title><![CDATA[android实现跳转第三方地图导航]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106917362</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106917362</guid><author>stonezry</author><pubDate>Tue, 23 Jun 2020 10:26:45 +0800</pubDate><description><![CDATA[最近有个需求，就是在自己的app项目里面直接根据定位，跳转进入百度或者高德地图进行导航。
val uri=Uri.parse("geo:24.473306,118.123456");  //打开地图定位
val it = Intent(Intent.ACTION_VIEW, uri)
val cn = it.resolveActivity(packageManager)
if(cn == null){
    Toast.makeText(this@MainActivity,"请先安装第三方导航软件",To]]></description><category></category></item><item><title><![CDATA[vue后台管理：增加vuex状态管理和封装axios请求]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106823393</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106823393</guid><author>stonezry</author><pubDate>Thu, 18 Jun 2020 09:42:19 +0800</pubDate><description><![CDATA[引入vuex状态管理
这里主要是参考了vue-element-admin的项目。先

先创建store的文件夹，创建index.js主文件：
import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
import user from './modules/user'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    user
  },]]></description><category></category></item><item><title><![CDATA[android 剪切板遇到的坑]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106689933</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106689933</guid><author>stonezry</author><pubDate>Thu, 11 Jun 2020 15:35:21 +0800</pubDate><description><![CDATA[最近想实现一个类似支付宝复制口令，然后打开运用就可以弹出弹框的功能。
在其他手机上面操作都没有问题，但是在华为上面就开始有问题了，估计是版本比较高。后来研究了一下，竟然是剪切板找不到内容。就是
if (!cm.hasPrimaryClip()) {
   return;
}

上面的cm.hasPrimaryClip()一直返回false。我就非常纳闷，明明已经复制了，而且是有内容的啊。
后来终于找到了问题，好像是安卓新规定，运用进入前台之后，剪切板得延迟一下才能拿到内容，不然就是空的。这就有点尴尬了。那就]]></description><category></category></item><item><title><![CDATA[docker部署项目（三）：docker-compose配置和部署]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106660755</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106660755</guid><author>stonezry</author><pubDate>Thu, 11 Jun 2020 10:05:09 +0800</pubDate><description><![CDATA[在usr/local目录下面创建一个docker文件夹

$ cd /usr/local
$ mkdir docker

进入docker文件里面创建创建一个demo的文件夹，docker-compose的项目及配置文件都会放在这里面。
$ cd docker
$ mkdir demo


写一个Dockerfile的文件，主要是对springboot项目的操作运行配置

$ cd demo
$ vi Dockerfile

vi是一个编辑命令，可以进入编辑页面进行编辑。关于vi的操作，请自行百度。
Do.]]></description><category></category></item><item><title><![CDATA[docker部署项目（二）：前后端打包]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106659521</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106659521</guid><author>stonezry</author><pubDate>Wed, 10 Jun 2020 10:30:54 +0800</pubDate><description><![CDATA[本来要直接进入主题将如何通过docker部署前后端分离的项目。后来想了一下，可能有些人还不知道怎么打包springboot的项目和vue项目。
这就有点难办了，所以这里简单说一下，因为确实也很简单。
springboot打包项目
确保配置文件信息正确，一个命令搞定所有：
mvn clean package -Dmaven.test.skip=true

该命令在对应项目所在根目录进行才能操作。
打包完成之后会在根目录里面的target文件夹里面生成*.jar的项目文件。这就是我们需要的项目打包文件。

vu]]></description><category></category></item><item><title><![CDATA[docker部署项目（一）：环境安装]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106634025</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106634025</guid><author>stonezry</author><pubDate>Tue, 09 Jun 2020 10:36:11 +0800</pubDate><description><![CDATA[我们之前的文章，用springboot+vue+redis简单写了一个前后端分离的后台管理系统。
那么问题来了。如果要部署到阿里云服务器怎么弄呢。如果是传统的部署方式，肯定是要在服务器按照顺序安装数据库mysql，tocat，nginx，redis，然后修改一大堆配置文件。但是，我不。
这里我准备用现在比较流行的docker进行部署。至于用docker部署有多香，我不说，但是妈妈再也不用担心我上学迟到了。
这里假装大家已经对docker基础有了一定的了解，因为网上有很多基础介绍，当然我不会告诉你其实我也一知]]></description><category></category></item><item><title><![CDATA[后台管理（四）：对axios网络请求结果的拦截处理]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106587659</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106587659</guid><author>stonezry</author><pubDate>Sat, 06 Jun 2020 15:22:36 +0800</pubDate><description><![CDATA[我们之前在处理token的时候，在axios里面进行的拦截设置，可以每次请求都在头部携带token信息，这样就不用每次请求的时候都要写一遍了。
// axios请求拦截
axios.interceptors.request.use(config =&gt; {
  config.headers.Authorization = window.sessionStorage.getItem('admin_token')
  return config
})

那么问题来了，token是有时效的，如果你有看我的后台]]></description><category></category></item><item><title><![CDATA[Activity进入和退出动画的实现]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106545973</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106545973</guid><author>stonezry</author><pubDate>Thu, 04 Jun 2020 14:49:17 +0800</pubDate><description><![CDATA[关于acitvity进入和退出动画可以在代码动态设置animation，也可以在主题设置style。
这里以activity从底部弹出和向下退出的动画效果为例。
activity.overridePendingTransition()
该方法有两个参数，一个是我们新启动的activity进入时的动画，另一个是当前activity退出时的动画
实现方式：

启动activity的设置

   startActivity(intent);
   overridePendingTransition(R.anim.]]></description><category></category></item><item><title><![CDATA[后台管理（三）：springboot批量删除，插入和事务]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106468265</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106468265</guid><author>stonezry</author><pubDate>Mon, 01 Jun 2020 11:19:03 +0800</pubDate><description><![CDATA[我学习搭建的vue后台管理，最近弄到用户-权限-角色的分配。
在做给角色分配权限的时候，涉及到数据库的批量删除，插入已经需要用到的事务。这里做一下记录。
批量删除

在分配的权限列表里面，我可以对角色分配的权限进行删除操作。权限分为三级。
如果是删除第一级或者第二级权限，那么子权限肯定也要跟着删除，所以这就需要批量删除了。
主要是在角色-权限关系表里面进行操作。这里主要将mapper里面的操作方式，其他没什么好讲的。
springboot mapper代码：
@DeleteProvider(type = P]]></description><category></category></item><item><title><![CDATA[阿里云centos服务器安装mysql]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106373859</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106373859</guid><author>stonezry</author><pubDate>Wed, 27 May 2020 10:12:29 +0800</pubDate><description><![CDATA[虽然现在在服务器上面用docker可以很方便的进行安装，不过可能也有不用docker的情况，这里做个记录。
所用数据库为mysql5.7
下载与安装MySQL

安装MySQL官方的yum repository

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm


下载rpm包

yum -y install mysql57-community-release-el7-10.noarch.rpm
]]></description><category></category></item><item><title><![CDATA[android关于Scrollview(或NestedScrollView)嵌套webview出现的问题解决]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106336585</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106336585</guid><author>stonezry</author><pubDate>Mon, 25 May 2020 16:42:19 +0800</pubDate><description><![CDATA[最近在做一些页面详情页的时候，因为需要用到NestedScrollView嵌套webview进行部分网页的显示。因为之前用的是4.4的android版本测试的，所有没有发现问题。
后来在android9.0的版本测试的时候，才发现会出现：webview的页面显示为空白或者高度为0这两种情况。 网上查了好多解决方案，基本都不能用，虽然有一个在onPageFinished里面重新设置webview的高度，但是这种限死高度的事情肯定是会有问题的，所有基本也可以放弃这个方案。
最后通过测试webview的加载过程，]]></description><category></category></item><item><title><![CDATA[pyhton爬虫学习（十七）：scrapy框架通过管道pipeline存储到mysql数据库]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106255713</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106255713</guid><author>stonezry</author><pubDate>Thu, 21 May 2020 14:54:39 +0800</pubDate><description><![CDATA[假设有这样一个需求，我们准备爬取如上图所示，京东商城的手机销售列表的信息，并存入到数据库中。  从图中，我们可以看到，准备存储这几个字段
图片（imageUrl），价格(price)，产品描述(description)，评论数(commentNum)，店名(shopName)
并且，我们还需要考虑分页爬取的问题。这里我们使用mysql数据库进行存储。Mysql操作这边我会说的很简单，毕竟不是我们本篇文章的重点。首先我们先创建数据库和存储的表。如下
CREATE DATABASE phonedb; 
cre.]]></description><category></category></item><item><title><![CDATA[pyhton爬虫学习（十六）：scrapy框架通过管道pipeline存储成文件]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106252759</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106252759</guid><author>stonezry</author><pubDate>Thu, 21 May 2020 11:57:40 +0800</pubDate><description><![CDATA[前面已经讲了scrapy框架的创建和运行，包括一些中间件的的设置和使用。  现在开始讲如何通过管道pipelines进行数据的存储，主要讲存储成文件形式。
我们知道创建的scrapy项目有一个pipelines.py的文件，这个文件就是用来存储我们定义的管道处理类的地方。不过要使用pipelines，首先需要在settings.py文件里面配置pipelines。
在setting.py文件里面找到关于pipelines的设置部分，默认设置如下所示。
# Configure item pipelines
#]]></description><category></category></item><item><title><![CDATA[android中onFinishInflate和onSizeChange()的调用时机]]></title><link>https://blog.youkuaiyun.com/stonezry/article/details/106251823</link><guid>https://blog.youkuaiyun.com/stonezry/article/details/106251823</guid><author>stonezry</author><pubDate>Thu, 21 May 2020 10:54:36 +0800</pubDate><description><![CDATA[1.onFinishInflate
onFinishInflate是view加载完xml之后执行的方法，相当于只是完成了布局的映射，在这个方法里面是得不到控件的高宽的，控件的高宽是必须在调用了onMeasure方法之后才能得到，而onFinishInflate方法是在setContentView之后、onMeasure之前。
2.onSizeChange()
控件大小改变后调用，一般调用顺序是：onMeasure() -&gt; onSizeChange() -&gt; onLayout() -&gt; o]]></description><category></category></item></channel></rss>