文档章节

scaloid开发android

lost_o0
 lost_o0
发布于 2014/06/23 23:01
字数 1363
阅读 581
收藏 4
点赞 0
评论 3

本篇文章被重新写了一遍,基本上一篇文章写完后,过20天后,就发现以前的观点站不住脚了。

scaloid强大的表现力

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="wrap_content" android:padding="20dip">
    <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content" android:text="Sign in"
            android:layout_marginBottom="25dip" android:textSize="24.5sp"/>
    <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content" android:text="ID"/>
    <EditText android:layout_width="match_parent"
            android:layout_height="wrap_content" android:id="@+id/userId"/>
    <TextView android:layout_width="match_parent"
            android:layout_height="wrap_content" android:text="Password"/>
    <EditText android:layout_width="match_parent"
            android:layout_height="wrap_content" android:id="@+id/password"
            android:inputType="textPassword"/>
    <Button android:layout_width="match_parent"
            android:layout_height="wrap_content" android:id="@+id/signin"
            android:text="Sign in"/>
    <LinearLayout android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        <Button android:text="Help" android:id="@+id/help"
                android:layout_width="match_parent" android:layout_height="wrap_content"/>
        <Button android:text="Sign up" android:id="@+id/signup"
                android:layout_width="match_parent" android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

is reduced to

new SVerticalLayout {
  STextView("Sign in").textSize(24.5 sp).<<.marginBottom(25 dip).>>
  STextView("ID")
  SEditText()
  STextView("Password")
  SEditText() inputType TEXT_PASSWORD
  SButton("Sign in")
  this += new SLinearLayout {
    SButton("Help")
    SButton("Sign up")
  }
}.padding(20 dip)

以上摘自scaloid github主页,是不是被其简洁性打动了呢,不管你有没有,至少我是心动的不行了。于是乎,这几天将 《疯狂android讲义》前面关于UI组件讲解的几个重点例子,用scaloid翻译了一遍。然后,现实告诉我们,简洁是有代价的...

activity初始化模版

class clazzName extends SActivity{activity=>
    lazy val comp1= new SUIComponent().styles//...
    lazy val comp2= new SUIComponent().styles//...
    onCreate{
        contentView = new SUILayout{
            this+=com1.<<.layoutStyles.>>
            this+=com1.<<.layoutStyles.>>
        }
        comp1.onClick{(_:android.widget.AdapterView[_], _:android.view.View,position: Int, _:Long)=>
            //todo
        }
    }
}

这基本就是我关于UI初始化的标准模版了(你也可以将lazy val换成var )。至于为什么不将layoutStyles写在声明后面,则是由于scaloid关于UI组件的实现都是继承与原生android api,并使用了的隐式转换(implicit context:Context) 来简化代码量。而渲染效率呢,则和用xml写布局的没什么区别。
这时,便出现了第一个问题:到底使用xml写view还是说用代码写view?

虽然最近一直在用代码写view,熟悉id,在实际生产环境下,我更倾向于使用后者,原因如下:

  • java和scala之间切换更容易

  • scala编译速度真的很慢

  • 可以直接通过可视化工具生成xml(据我了解,有不少android程序员都是通过拖拽来实现布局的)

  • 减少progurd配置

写view组件

当你要开发view组件时,最好参照scaloid已经写好的组件。例如你要实现一个View,最好时继承scaloid的 TraitView,这样你才能拥有一些简便的api。还有一些构造函数等问题,基本上照着scaloid源码来,基本上没啥大问题。

scaloid资料

scaloid的网络资源真心不丰富,github上的readme+官方blog几乎就是所有资料了。很多api都没有覆盖到,基本上你要用到哪里,就要去扒一下源码才可以。我在里碰到的问题呢,是说,一些java原生api(例如 SimpleArrayAdapter)是不支持scala集合的?

这里的解决方案:

  1. 集合等api全部使用java原生的

  2. 使用scala集合,然后进行类型转换

  3. 摒弃掉java原生api,使用scaloid提供的或者自己封装

以上方案,用第一种,就真心没必要使用scala语言了,直接java写会更省劲;第二种,最好自己封装一些隐式转换加快开发;第三种,初期比较痛苦,得查scaloid api以及看源码,才能掌握好用法,往后发展的话,还是蛮ok的。


scaloid和proguard

貌似只要和scala占上边的就没有什么是简单的,不管是scala的类型系统还是sbt build工具,每一个都需要花大量的时间来入门。当scala与android结合时,更是如此。

当你用scala开发android正爽的时候,突然发现编译报 classNotFound 的错误,而产生这个问题根源则是proguard剪切代码带来的,如果你懒的解决这个问题呢,可以直接sbt 运行 clean  android:run 指令。如果要想好好的解决这个问题呢,推荐看看douban-android项目的以proguard开头的两个配置文件。


scaloid对原有api的简化

除了view组件的api进行简化外,还对log,ui更新等做了简化,简化后,用起来真心舒适,github上关于简化的讲解,基本能让你上手使用。代码量有大幅的减少。

遇到的小坑

与其说是小坑,倒不如说时对api的掌握程度不够造成的。将小坑记录在这里

//颜色转换
new ColorDrawable(Color.parseColor("#F00000"))

//动画效果  
AnimationUtils.loadAnimation(context,android.R.anim.fade_out)

还有一些是java和scala混用带来的一些问题,这里就不做赘述了,如果真想用scala做开发的话,就尽量减少直接调用原生java api的机会。还有就是scala开发和java开发还是有很多细节上的不同,一些思维上还是要做一些转变的,现在用scaloid写的开源的android真心少,开发技巧更多还是从一些后台代码中学习吧。

小结

总的来讲,除了一贯的编译速度慢以外,用scala开发android,对源码的阅读和学习能力要求还是蛮高的,如果没有真正的需求或者能跟得上技术的团队的话,还是用java开发好一点,简单即效率。


© 著作权归作者所有

共有 人打赏支持
lost_o0
粉丝 10
博文 37
码字总数 31139
作品 0
烟台
加载中

评论(3)

中成才
中成才
玩 Scala 的握个爪:dog:
感觉太煽情
感觉太煽情
看了下,本打算学学的,发现学习时间成本太高。
飞扬的风
cool
Ubuntu13.10上android+idea+scala+sbt环境搭建

首先声明,开发android,不是一定要使用ADT或者AndroidStudio等google提供的IDE,其实这两个也就是分别在eclipse和Idea上装了相应的插件而已。唯一需要的就是SDK而已,甚至模拟器都可以不需要...

谦谦君子
2013/11/28
0
0
Android Scala IDEA 环境

最近想搞android,scala又是我比较喜欢的语言,于是乎,就想搞个他们的结合体。 搞这个环境被折磨了好久,从下载android sdk到IDE,再到版本兼容,基本上能碰到的问题都碰了个遍。 先说andro...

lost_o0
2014/06/08
0
0
Android组件及UI框架大全

Android 是目前最流行的移动操作系统(还需要加之一吗?)。 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件。 本文试图将目前流行...

千山万水
2015/07/13
0
0
Android组件及UI框架大全

Android 是目前最流行的移动操作系统(还需要加之一吗?)。 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件。 本文试图将目前流行...

千山万水
2015/07/13
0
4
​Android 开发库--scaloid

scaloid是一个Android的开发库。使用Scala让代码更加简洁,清晰。 For example, the code block shown below: val button = new Button(context)button.setText("Greet")button.setOnClickL......

ForEleven
2014/08/25
1K
0
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊
06/21
0
0
《老罗Android开发视频教程》老罗来交国庆的答卷了

  之前在博客园、开源中国、安卓巴士发表的《老罗将死,或者Android也将就换代,但是互联网的,共享,互助精神将永存》,计划出300集免费的、高质量的、全面的Android开发视频教程,得到了...

qixinghaitang
2012/10/09
0
2
Android源码50例汇总,欢迎各位下载

下载中心好资料很多,藏在各个角落,小弟在此帮大家做了一个整理,做了一个下载目录,方便大家选择性下载。 源码实例如下: 《Android应用开发揭秘》源代码推荐 http://down.51cto.com/data...

程序袁_绪龙
2015/01/23
0
0
最强最全干货分享:Android开发书籍、教程、工具等

最全干货分享,本文收集整理了Android开发所需的书籍、教程、工具、资讯和周刊各种资源,它们能让你在Android开发之旅的各个阶段都受益。 入门 《Learning Android(中文版)》 本书为Andro...

拉偶有所依
2015/01/09
0
1
AndroidThings之基础一 基本概念

转载自:https://blog.csdn.net/weixin41636248/article/details/79069994 Android Things是什么 一句话说,AndroidThings就是让开发者可以使用Android开发工具开发嵌入式设备。 If you can...

qq_28831197
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知识点总结

jq如何拿到data-info的自定义属性 1.1 原生可以获取到所有属性el.attrbutes 1.2 jq的$(el).attr('属性名称') 继承的几种方式,原型链 2.1 扩展原型对象实现继承 2.2 替换原型对象实现继承 2....

litCabbage
3分钟前
0
0
python语言规范

http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/...

ghou-靠墙哭
6分钟前
0
0
istio 监控,遥测 (理论)

Istio提供了一种灵活的模型来强制执行授权策略并收集网格中服务的遥测。 基础架构后端旨在提供用于构建服务的支持功能。它们包括诸如访问控制系统,遥测捕获系统,配额执行系统,计费系统等之...

xiaomin0322
9分钟前
0
0
阿里资深专家面试问题收集

corejava hashcode相等的两个对象一定相等吗?equals呢?反过来相等吗? 介绍一下集合框架? hashtable,hashmap底层实现是什么?hashtable和concurrenthashmap底层实现的区别? hashmap和treemap的...

undefine
10分钟前
4
0
alpine安装软件指定安装源

linux-alpine安装软件指定安装源 一、永久修改apk下载源地址 vi etc/apk/repositories 替换成阿里源 http://mirrors.aliyun.com/alpine/v3.8/main/http://mirrors.aliyun.com/alpine/v3...

我心中有猛狗
10分钟前
0
0
Centos7通过yum安装nginx

添加源地址(直接install可能不是最新版本的) sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装 sudo yum install -y ng......

iplusx
12分钟前
0
0
ef .core Dapper Helper

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Threading.Tasks; using Dapper; using Dap......

Lytf
14分钟前
0
0
iOS 小笔记

1.以下代码打印什么     __block int val = 10;    void (^blk)(void) = ^{        printf("val=%d\n",val);        };       val = 2;    blk(); /...

风了个1
16分钟前
0
0
【Spring Boot 系列 Spring Boot示例程序】

入门程序步骤,创建一个Maven项目。继承Spring Boot官方提供的父工程。再引入一个Web的应用启动器。 1、选择一个合适的IDEA工具 创建一个Maven工程,并添加如下配置 <parent> <...

HansonReal
17分钟前
0
0
217. Contains Duplicate - LeetCode

Question 217. Contains Duplicate Solution 题目大意:判断数组中是否有重复元素 思路:构造一个set,不重复就加进去,重复返回true,如果数据量大的话,可以用布隆过滤器 Java实现: publ...

yysue
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部