悠悠风来

悠悠风来 查看完整档案

深圳编辑成都信息工程大学  |  物联网专业 编辑社会公司  |  web前端工程师 编辑 segmentfault.com/u/zhqsmile 编辑
编辑

你不拼一把,怎么知道自己是不是金子

个人动态

悠悠风来 发布了文章 · 1月13日

动态设置keyframes实现列表向上滚动动画

1、html部分

<div class="xsck-list">
 <div :key="item.id" class="xsck-list__li" v-for="(item, index) in orderList">
    <div class="xsck-list__left">
        {{item.biOrgsName}}
    </div>
    <div class="xsck-list__right">
       {{item.taxAllAmount}}
    </div>
  </div>
 </div>

2、js部分

// 动态设置keyframes实现向上滚动
// keyName动画名称,el执行动画的元素, time动画执行时间
setKeyframes(keyName, el, time = 1000) {
  // 因为元素列表需要重复一份,所以移动的高度是元素高度的一半
  const transformHeight = el.offsetHeight / 2;
  const keyframes = `@keyframes ${keyName}{
      0% {
        transform: translateY(0);
      }
      100% {
        transform: translateY(-${transformHeight}px);
      }
  }`;
  const style = document.createElement('style');
  style.type = 'text/css';
  // 将 keyframes样式写入style内
  style.innerHTML = keyframes;
  // 将style样式存放到head标签
  document.getElementsByTagName('head')[0].appendChild(style);
  // 为需要设置滚动动画的元素设置动画值
  el.setAttribute(
    'style',
    // animation-fill-mode: forwards 将动画重置为第一帧,实现无缝的播放了
    `animation:${keyName} ${time}s linear infinite;animation-fill-mode: forwards`,
  );
},

3、调用

// 为实现动画无缝播放,列表元素的值应是[1,2,3,1,2,3]这样的形式,这样才能让123循环无缝播放
this.orderList = this.xsckRankList.concat(this.xsckRankList);
const el = document.querySelector('.xsck-list');
this.setKeyframes('myNove', el);

4、参考
(1) https://www.jianshu.com/p/b7b...
(2) https://blog.csdn.net/qq_4180...
(3) https://developer.mozilla.org...
(4) https://developer.mozilla.org...

查看原文

赞 0 收藏 0 评论 0

悠悠风来 发布了文章 · 2020-11-13

PC端只对指定页面做自适应(vue&postcss-pxtorem)

一、postcss-pxtorem安装

npm install -S postcss-pxtorem

二、rem 配置

##  rem.js
function setRem() {
  `// 基准大小
  const baseSize = 100;
  const baseScale = baseSize / 1920; // 1920的设计图
  let widthScale = window.innerWidth; // 当前窗口的宽度
  const heightScale = window.innerHeight; // 当前窗口的高度
  // 尺寸换算
  const comparedHeight = (widthScale * 1080) / 1920;
  if (heightScale < comparedHeight) {
    widthScale = (heightScale * 1920) / 1080;
  }
  // 计算实际的rem值,得到该宽度下的相应font-size值,并赋予给html的font-size,
  const rem = widthScale * baseScale;
  document.documentElement.style.fontSize = ${rem}px;
}
// 初始化
setRem();
// 改变窗口大小时重新设置 rem
window.onresize = () => {
  setRem();
};`

三、在main.js里面引入

import './utils/rem';

四、配置postcss-pxtorem

### 根目录的postcss.config.js
`module.exports = {
  plugins: {
    autoprefixer: {},
    'postcss-pxtorem': {
      rootValue: 100,
      minPixelValue: 12,
      propList: ['*'],
      exclude: (e) => {
        if (/src(\\|\/)views(\\|\/)Screen/.test(e)) {
          return false;
        }
        return true;
      },
    },
  },
};`

五、忽略单个属性的方式(不转换rem)

1、配置propList: ['*', '!border', '!font-size'], 
2、像素单元声明中使用大写
    .rank-list__text {
      width: 300Px;
    }

六、参考文档

1、https://www.npmjs.com/package/postcss-pxtorem
2、https://www.njleonzhang.com/2018/08/15/flexible-pc-full-screen.html
3、https://www.cnblogs.com/WhiteM/p/12720849.html
查看原文

赞 0 收藏 0 评论 0

悠悠风来 发布了文章 · 2020-11-11

linux下安装MySQL8

说明:
• 本文档以“CentOS7.5”操作系统,mysql8为例
• CentOS 7及以上版本将MySQL数据库软件从默认的程序列表中移除,需执行sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 进行手动下载。下载完成后可按照2进行安装。
(Mysql仓库源地址:https://dev.mysql.com/downloads/repo/yum/,可在这找到系统对应的yun地址)
  1. 执行以下命令,安装MySQL数据库服务器、MySQL客户端和MySQL开发所需的库及包含文件。
    yum install -y mysql-server mysql mysql-devel
  2. 回显如下,说明安装成功。

      Complete!
      配置MySQL
  3. 执行以下命令,启动MySQL服务。

     service mysqld start
  4. Mysql8安装之后会有个初始密码,查看初始密码

    查看初始密码:cat /var/log/mysqld.log |grep temporary
    mysqladmin -u root password 'Huawei@123'
  5. 执行以下命令,再根据提示输入数据库管理员root账号的密码进入数据库。

    mysql -u root -p
  6. 执行以下命令,使用MySQL数据库。

    use mysql
  7. 执行以下命令,查看用户列表。

    select host,user from user;
  8. 执行以下命令,刷新用户列表并允许所有IP对数据库进行访问。

    update user set host='%' where user='root' LIMIT 1;
  9. 执行以下命令,强制刷新权限。允许同一子网中设置为允许访问的云服务器通过私有IP对MySQL数据库进行访问。

    flush privileges;
  10. 执行以下命令,退出数据库。

    quit
  11. 执行以下命令,重启MySQL服务。

    systemctl restart mysql
  12. 执行以下命令,设置开机自动启动MySQL服务。

    systemctl enable mysqld
  13. 执行以下命令,关闭防火墙。

    systemctl stop firewalld
  14. 执行以下命令,设置服务器重启后永久关闭防火墙。

    systemctl disable firewalld
  15. 遇到的问题:
    (1)重置密码 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';

    报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    解决方法:set global validate_password.policy=0;set global validate_password.length=8;
    参考:https://www.cnblogs.com/fb010001/p/9036275.html;https://blog.csdn.net/hello_world_qwp/article/details/79551789

    (2)忘记密码:

    参考: https://blog.csdn.net/qq_41526316/article/details/108434810

16.修改密码:

(1)mysqladmin -u root -p password "test123" ; Enter password: 【输入原来的密码】;
(2)ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';FLUSH PRIVILEGES;

来自 https://support.huaweicloud.c...

查看原文

赞 0 收藏 0 评论 0

悠悠风来 发布了文章 · 2020-11-11

linux下使用localhost和127.0.0.1连接不上mysql数据库的问题

一、问题描述
1、在linux下安装完mysql之后,通过mysqladmin指令设置了管理员权限密码;

    mysqladmin -u root password '密码'

2、通过mysql -u root -p 输入设置的密码,死活提示

    ‘ERROR 1045 (28000): Access denied for user    'root'@'localhost' (using password: YES)’ 

3、把这条报错贴到浏览器去搜索,再根据网上的方式去操作,试过n种方法,都没成功
4、最后没办法,以为自己哪里的权限配置错了,把数据库卸了重装,这个问题依旧在
二、问题解决
1、尝试用客户端去连接数据库,神奇的发现居然可以连接
2、再用mysql -h 127.0.0.1 -u root -p输入密码去连接,还是一样的报错
3、再然后就用服务器的内网ip去连接,终于进去了
image.png
4、接下来就开始找原因了

(1)首先查找用户信息,发现localhost的user不是root   

image.png

(2)更新user表设置localhost的用户为root
update mysql.user set user = 'root' where host = 'localhost';
(3)再次mysql -u root -p + 密码,问题还是在

image.png

(4)又回去查看用户信息表,发现localhost和127.0.1没有对应的密码

image.png

(5)给用户为root的地址都设置同一密码
UPDATE mysql.user SET Password=PASSWORD('密码') where USER='root';

image.png

(6)刷新权限列表,再次用mysql -u root -p + 密码去连接数据库就可以了

image.png
image.png
(7)由于没有给localhost赋权限,通过mysql -u root -p登进去之后,创建数据库会报没权限的错
image.png

退出数据库,用内网ip去登录,然后付权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'zhq-894612' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY 'zhq-894612' WITH GRANT OPTION;
flush privileges;
现在再用 mysql -u root -p 去登录就没什么问题了

三、mysql种localhost和127.0.1的区别,推荐文档

https://gohalo.me/post/mysql-localhost-vs-127.0.0.1-introduce.html

四、总结

这个问题并没有那么难,只是自己linux和mysql知识不够扎实,才绕了一大圈弯路;如果一开始就去分析用户信息,或许就能更快解决问题
遇到问题是痛苦的,解决过程是煎熬的,分析问题并解决是快乐的!!!
查看原文

赞 0 收藏 0 评论 0

悠悠风来 发布了文章 · 2020-06-15

将element UI 中 el-table 数据原样导出到Excel

一、安装依赖

npm  install  --save  xlsx  file-saver

二、在需要导出成excel的文件里面引入依赖
image.png
三、methods里面写个导出的方法

exportExcel(excelName) {
       //excelName --设置导出的excel名称
       //report-table --对应的要导出的el-table的ref名称
      try {
        const $e = this.$refs['report-table'].$el;
        // 如果表格加了fixed属性,则导出的文件会生产两份一样的数据,所以可在这里判断一下
        let $table = $e.querySelector('.el-table__fixed');
        if (!$table) {
          $table = $e;
        }
        // 为了返回单元格原始字符串,设置{ raw: true }
        const wb = XLSX.utils.table_to_book($table, { raw: true });
        const wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' });
        FileSaver.saveAs(
          new Blob([wbout], { type: 'application/octet-stream' }),
          `${excelName}.xlsx`,
        );
      } catch (e) {
        if (typeof console !== 'undefined') console.error(e);
      }
 },

image.png
四、参考文档
https://blog.csdn.net/u010427...
https://github.com/SheetJS/js-xlsx
https://github.com/eligrey/FileSaver.js

查看原文

赞 0 收藏 0 评论 0

悠悠风来 发布了文章 · 2018-02-26

前端如何让网页打印时每一页都有固定的头部,且在达到固定高度时自动分页

页面效果:

第一页

clipboard.png

第N页

clipboard.png

业务需求:

1.网页点击打印时,打印渲染的页面每一页的头部都要有公司logo;
2.而且分页时不能让某一行的表格断开(必须在达到固定高度时让页面自动分页);

为了实现上述需求,过程可谓心塞
我首先尝试着让每一页的头部都能打印出相同的东西,
本来想偷个懒,借助浏览器自带的打印设置功能,却发现行不通行不通
谷歌虽然也有设置页眉页脚的功能,但是它有自己固定的格式,根本设置不了自己想要的内容

页眉
clipboard.png

页脚
clipboard.png

谷歌不行,我还是不死心,就是想用现成的东西来实现,所以呢
我又去尝试火狐,惊喜不,火狐可以设置页眉页脚,然而
并没有什么*用,又加不进去logo,然后呢
我肯定又去试了一下IE(哼哼,还是不行,我就不截图演示了)

clipboard.png

好吧,我终于有一点点死心了,还是我自己来搞吧,接着就是各种百度,找方法,看别人的代码。
中间尝试过这种方法:https://codeday.me/bug/20170302/3239.html

clipboard.png

clipboard.png

这种方法是我当时能找到的我觉得最需求的方法,但是它有一个让人无法容忍的缺点,
打印渲染时,每一页的头部会和内容重合在一起,这显然是不行的!

所以最后还是得重新研究其他方法:
最后达成目的的思路是:
1.首先在页面布局的时候,去获取每一行表格内容的高度相加再加上其他固定部分的高度,
如果超过某个高度(这个高度大致等于打印时页面的高度)就添加你想要的头部html结构
2.在这个高度到达时,就让打印页面自动分页,这个可以通过
page-break-before:always这个css属性来实现

html结构:

clipboard.png

clipboard.png

clipboard.png

css样式:

clipboard.png

clipboard.png

js部分:

clipboard.png

clipboard.png

查看原文

赞 3 收藏 7 评论 7

悠悠风来 关注了标签 · 2018-02-04

行业

行業,指主要根據職業、性質或具體事物,對社會各個領域稱呼。“行業”屬於中文表述的一種習慣,极少作为術語来表示特定的概念,有時與辭彙“产业”混淆使用,來表示同一概念,常指社会领域。行业属于概念广泛的常用中文词汇,其分类具有随意性。

关注 52431

悠悠风来 关注了标签 · 2018-02-04

android

Android(安卓或安致)是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

简介

  Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。 

  系统架构

  android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。

  应用程序

  Android会同一系列核心应用程序包一起发布,该应用程序包包括客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。

  应用程序框架

  开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。

  隐藏在每个应用后面的是一系列的服务和系统, 其中包括;

  丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。

  内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据

  资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。

  通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。

  活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。

  有关更多的细节和怎样从头写一个应用程序,请参考 如何编写一个 Android 应用程序。

  系统运行库

  Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:

  * 系统 C 库 - 一个从BSD继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux的设备定制的。

  * 媒体库 - 基于PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

  * Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。

  * LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。

  应用程序组件

  Android开发四大组件分别是:活动(Activity): 用于表现功能。服务(Service): 后台运行服务,不提供界面呈现。广播接收器(BroadcastReceiver):用于接收广播。内容提供商(Content Provider): 支持在多个应用中存储和读取数据,相当于数据库。

  活动

  Android 中,Activity 是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。在Android的程序当中,Activity 一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Activity就相当于一个网页。在Activity 当中可以添加一些Button、Check box 等控件。可以看到Activity 概念和网页的概念相当类似。

  一般一个Android 应用是由多个Activity 组成的。这多个Activity 之间可以进行相互跳转,例如,按下一个Button 按钮后,可能会跳转到其他的Activity。和网页跳转稍微有些不一样的是,Activity 之间的跳转有可能返回值,例如,从Activity A 跳转到Activity B,那么当Activity B 运行结束的时候,有可能会给Activity A 一个返回值。这样做在很多时候是相当方便的。

  当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为Android会把每个应用的开始到当前的每个屏幕保存在堆栈中。

  服务

  Service 是android 系统中的一种组件,它跟Activity 的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service 是没有界面的长生命周期的代码。Service 是一种程序,它可以运行很长时间,但是它却没有用户界面。这么说有点枯燥,来看个例子。打开一个音乐播放器的程序,这个时候若想上网了,那么,我们打开Android 浏览器,这个时候虽然我们已经进入了浏览器这个程序,但是,歌曲播放并没有停止,而是在后台继续一首接着一首的播放。其实这个播放就是由播放音乐的Service进行控制。当然这个播放音乐的Service也可以停止,例如,当播放列表里边的歌曲都结束,或者用户按下了停止音乐播放的快捷键等。service 可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD 卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

  开启service有两种方式:

  (1) Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次 );stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。 注意,多次调用Context.startservice()不会嵌套(即使会有相应的onStart()方法被调用),所以无论同一个服务被启动了多少次,一旦调用Context.stopService()或者stopSelf(),他都会被停止。补充说明:传递给startService()的Intent对象会传递给onStart()方法。调用顺序为:onCreate --> onStart(可多次调用) --> onDestroy。

  (2) Context.bindService():Service会经历onCreate() --> onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind --> onDestroyed相应退出,所谓绑定在一起就共存亡了。[20]

  广播接收器

  在Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver 是对发送出来的Broadcast进行过滤接受并响应的一类组件。可以使用BroadcastReceiver 来让应用对一个外部的事件做出响应。这是非常有意思的,例如,当电话呼入这个外部事件到来的时候,可以利用BroadcastReceiver 进行处理。例如,当下载一个程序成功完成的时候,仍然可以利用BroadcastReceiver 进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。BroadcastReceiver通过NotificationManager 来通知用户这些事情发生了。BroadcastReceiver 既可以在AndroidManifest.xml 中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。只要是注册了,当事件来临的时候,即使程序没有启动,系统也在需要的时候启动程序。各种应用还可以通过使用Context.sendBroadcast () 将它们自己的intent broadcasts广播给其他应用程序。

  注册BroadcastReceiver有两种方式:

  (1)在AndroidManifest.xml进行注册。这种方法有一个特点即使你的应用程序已经关闭了,但这个BroadcastReceiver依然会接受广播出来的对象,也就是说无论你这个应用程序时开还是关都属于活动状态都可以接受到广播的事件;

  (2)在代码中注册广播。

  第一种俗称静态注册,第二种俗称动态注册,这两种注册Broadcast Receiver的区别:

  动态注册较静态注册灵活。实验证明:当静态注册一个Broadcast Receiver时,不论应用程序是启动与否。都可以接受对应的广播。

  动态注册的时候,如果不执行unregister Receiver();方法取消注册,跟静态是一样的。但是如果执行该方法,当执行过以后,就不能接受广播了。

  内容提供

  Content Provider 是Android提供的第三方应用数据的访问方案。

  在Android中,对数据的保护是很严密的,除了放在SD卡中的数据,一个应用所持有的数据库、文件等内容,都是不允许其他直接访问的。Andorid当然不会真的把每个应用都做成一座孤岛,它为所有应用都准备了一扇窗,这就是Content Provider。应用想对外提供的数据,可以通过派生Content Provider类, 封装成一枚Content Provider,每个Content Provider都用一个uri作为独立的标识,形如:content://com.xxxxx。所有东西看着像REST的样子,但实际上,它比REST 更为灵活。和REST类似,uri也可以有两种类型,一种是带id的,另一种是列表的,但实现者不需要按照这个模式来做,给你id的uri你也可以返回列表类型的数据,只要调用者明白,就无妨,不用苛求所谓的REST。

  另外,Content Provider不和REST一样只有uri可用,还可以接受Projection,Selection,OrderBy等参数,这样,就可以像数据库那样进行投影,选择和排序。查询到的结果,以Cursor(参见:reference/android/database/Cursor.html )的形式进行返回,调用者可以移动Cursor来访问各列的数据。

  Content Provider屏蔽了内部数据的存储细节,向外提供了上述统一的接口模型,这样的抽象层次,大大简化了上层应用的书写,也对数据的整合提供了更方便的途径。Content Provider内部,常用数据库来实现,Android提供了强大的Sqlite支持,但很多时候,你也可以封装文件或其他混合的数据。

  在Android中,Content Resolver是用来发起Content Provider的定位和访问的。不过它仅提供了同步访问的Content Provider的接口。但通常,Content Provider需要访问的可能是数据库等大数据源,效率上不足够快,会导致调用线程的拥塞。因此Android提供了一个AsyncQueryHandler(参见:reference/android/content/AsyncQueryHandler.html),帮助进行异步访问Content Provider。

  在各大组件中,Service和Content Provider都是那种需要持续访问的。Service如果是一个耗时的场景,往往会提供异步访问的接口,而Content Provider不论效率如何,都提供的是约定的同步访问接口。

软件开发

  Java方面

  Android支持使用Java作为编程语言来开发应用程序,而Android的Java开发方面从接口到功能,都有层出不穷的变化。考虑到Java虚拟机的效率和资源占用,谷歌重新设计了Android的Java,以便能提高效率和减少资源占用,因而与J2ME等不同。其中Activity等同于J2ME的MIDlet,一个 Activity 类(Class)负责创建视窗(Windows),一个活动中的Activity就是在 foreground(前景)模式,背景运行的程序叫做Service。两者之间通过由ServiceConnection和AIDL连结,达到复数程序同时运行效果。如果运行中的 Activity 全部画面被其他 Activity 取代时,该 Activity 便被停止(Stopped),甚至被系统清除(Kill)。

  View等同于J2ME的Displayable,程序人员可以通过 View 类与“XML layout”档将UI放置在视窗上,Android 1.5的版本可以利用 View 打造出所谓的 Widgets,其实Widget只是View的一种,所以可以使用xml来设计layout,HTC的Android Hero手机即含有大量的widget。至于ViewGroup 是各种layout 的基础抽象类(abstract class),ViewGroup之内还可以有ViewGroup。View的构造函数不需要再Activity中调用,但是Displayable的是必须的,在Activity 中,要通过findViewById()来从XML 中取得View,Android的View类的显示很大程度上是从XML中读取的。View 与事件(event)息息相关,两者之间通过Listener 结合在一起,每一个View都可以注册一个event listener,例如:当View要处理用户触碰(touch)的事件时,就要向Android框架注册View.OnClickListener。另外还有BitMap等同于J2ME的Image。   

关注 64608

悠悠风来 关注了标签 · 2018-02-04

关注 65927

认证与成就

  • 获得 44 次点赞
  • 获得 3 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 3 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-11-24
个人主页被 803 人浏览