Android背景设置透明和半透明效果 android背景透明度怎么设置

前言最近Kotlin的呼声又是日益高涨 。前几天9012年Google IO正式将Kotlin从first _class提升为kotlin_first 。我也是接触了一段时间的Kotlin 。给我的感觉就是简约 。快速 。无需繁琐的findId 。高阶函数的应用 。再加上Kotlin的null 安全 。更是将代码的崩溃率降到更低 。
今天我们就来介绍一下今天的主角—Anko
1.AnkoAnko是JetBrains开发的一个强大的库,说起JetBrains。那就牛逼了 。Kotlin语言是他们开发的 。最流行的的开发工具intellij idea都是他们开发的 。AS也是基于IDEA的 。好了 。言归正传 。Anko是Kotlin官方开发的一个让开发Android应用更快速更简单的Kotlin库,并且能让我们书写的代码更简单清楚更容易阅读 。它包括多个部分

  1. Anko Commons: a lightweight library full of helpers for intents, dialogs, logging and so on;
  2. Anko Layouts: a fast and type-safe way to write dynamic Android layouts;
  3. 【Android背景设置透明和半透明效果 android背景透明度怎么设置】Anko SQLite: a query DSL and parser collection for Android SQLite;
  4. Anko Coroutines: utilities based on the kotlinx.coroutines library.
1.1 如何使用添加依赖
dependencies{implementation"org.jetbrains.anko:anko:$anko_version"}
这里面包括上面四个部分 。当然你也可以只依赖一个部分 。如下:
dependencies{//AnkoCommonsimplementation"org.jetbrains.anko:anko-commons:$anko_version"//AnkoLayoutsimplementation"org.jetbrains.anko:anko-sdk25:$anko_version"//sdk15,sdk19,sdk21,sdk23arealsoavailableimplementation"org.jetbrains.anko:anko-appcompat-v7:$anko_version"//CoroutinelistenersforAnkoLayoutsimplementation"org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"implementation"org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"//AnkoSQLiteimplementation"org.jetbrains.anko:anko-sqlite:$anko_version"}
下面我们分别介绍这几个功能 。
2 AnkoCommonsAnkoCommons对Android开发者来说是一个工具集 。包括但不限于下面这几个
  1. Intents
  2. Dialogs and toasts
  3. Logging
  4. Resources and dimensions
2.1 Intents前面已经提到 。Commons 库是一个工具集 。那Intents主要是帮助简化Activity之间的跳转 。
传统的 Kotlin 启动新的 Activity 的方式是创建一个 Intent 。同时可能传递一些参数 。最后将创建的 Intent 通过 Context 的 startActivity() 方法传递 。就像这样:
valintent=Intent(this,SomeOtherActivity::class.java)intent.putExtra("id",5)intent.setFlag(Intent.FLAG_ACTIVITY_SINGLE_TOP)startActivity(intent)
然鹅你用Anko只需要这样:
startActivity(intentFor(“id” to 5).singleTop())
如果想要传递多个参数 。你也可以这样
startActivity<SomeOtherActivity>("id"to5,"city"to"Denpasar")
当然还有一些关于Intent的其它操作 。如:拨打电话等:如下
Android背景设置透明和半透明效果 android背景透明度怎么设置

文章插图

Android背景设置透明和半透明效果 android背景透明度怎么设置

文章插图
2.2 Dialogs and toasts这个库主要是用来快速搭建Dialog和toast 。具体包含以下几个
  • Toast
  • SnackBar
  • Alert (Dialog)
  • Selectors
  • Progress dialogs
2.2.1 ToastAnko为我们提供了更加简单的Toast使用 。只需要一行代码即可实现
toast("Hithere!")toast(R.string.message)longToast("Wow,suchduration")
2.2.2 SnackBarsSnackBar是 Android Support Library 22.2.0 里面新增提供的一个控件,我们可以简单的把它理解成一个加强版的Toast 。或者是一个轻量级的Dialog 。
我们可以用下面代码快速创建snackbar 。
view.snackbar("Hithere!")view.snackbar(R.string.message)view.longSnackbar("Wow,suchduration")view.snackbar("Action,reaction","Clickme!"){doStuff()}
这里需要传入view对象 。这个可以是布局中的任意一个view对象 。
2.2.3 AlertsAnko Alerts主要包括以下几个功能:
  1. Android 默认dialog
  2. Android Appcompat 中AlertDialog
  3. 自定义Dialog
1.Android 默认dialog
通过以下代码就可以构建一个可以交互的Android 默认dialog 。
alert("Hi,I'mRoy","Haveyoutriedturningitoffandonagain?"){yesButton{toast("Oh…")}noButton{}}.show()
代码比较简单 。就不做解释 。
2.Android Appcompat 中AlertDialog
另外Anko还提供了Appcompat的AlertDialog实现方式 。如下:
alert(Appcompat,"Sometextmessage").show()
3.自定义Dialog
什么 。不能自定义dialog吗?怎么会 。自定义dialog也是非常的简单
alert{customView{editText()}}.show()
2.2.4 Selectors (包含列表的Dialog)
我们平时创建列表Dialog是这样的:
vallistItems=arrayOf("Russia","USA","Japan","Australia")//传数组vallistDialog:AlertDialog.Builder=AlertDialog.Builder(this)listDialog.setItems(listItems){p0,p1-> toast(p1)}valdialog:AlertDialog=listDialog.create()dialog.show()valwindow:Window=dialog.windowvalparams:WindowManager.LayoutParams=window.attributesparams.y=45*ScreenUtils.getScreenDensity().toInt()params.gravity=Gravity.TOPorGravity.RIGHTparams.width=ScreenUtils.getScreenWidth()/2params.height=ViewGroup.LayoutParams.WRAP_CONTENTwindow.attributes=params
但是我们用Anko是这样的:
valcountries=listOf("Russia","USA","Japan","Australia")//传listselector("Whereareyoufrom?",countries,{dialogInterface,i->toast("Soyou'relivingin${countries[i]},right?")})
看起来只是简化了dialog的创建过程 。
2.2.5 Progress dialogs不显示进度的 Loading Dialg
pressDialog("Pleasewaitaminute.","Downloading…")indeterminateProgressDialog("Fetchingthedata…")
2.3 Logging打印log辅助工具 。
Android SDK 提供 android.util.Log 类来提供一些 logging 方法 。。这些方法都很实用 。但是我们每次必须传递一个 Tag 参数 。同时这个 Tag 信息必须是 String 类型的 。这就略显麻烦 。不过现在我们可以通过 AnkoLogger 类摆脱这些恼人的问题:
classSomeActivity:Activity(),AnkoLogger{funsomeMethod(){info("Infomessage")debug(42)//.toString()methodwillbecalledautomatically}}
默认的 Tag 名是当前的类名( 本例中的是SomeActivity) 。但是通过重写 AnkoLogger 的 loggerTag 属性我们是可以来更改的 。而且每个方法有两个版本:plain and lazy (inlined)
1.Lazy:
info("String"+"concatenation")info{"String"+"concatenation"}
2.plain:
classSomeActivity:Activity(){privatevallog=AnkoLogger(this.javaClass)privatevallogWithaspecificTag=AnkoLogger("my_tag")privatefunsomeMethod(){log.warning("Bigbrotheriswatchingyou!")}}
上面两种方法分别是不同Tag的实现方式 。
AnkoLogger中loggerTag 属性具体对照如下:
2.4 Resources and dimensions你可以在你的项目中使用Anko Resources and dimensions来简化你的代码 。例如Color、Dimen等 。颜色透明度直接色值.opaque就可以 。尺寸的话直接使用dip(dipValue)、sp(spValue)就可以 。在这里面还有一个就是applyRecursively()用来控制子View的操作 。如:
verticalLayout{textView{text="EditText01"backgroundColor=0xff000.opaquetextSize=14f}textView{text="EditText02"backgroundColor=0x99.gray.opaquetextSize=23f}}.applyRecursively{//如果是ViewGroup的话可以使用applyRecursively来为每个ChildView进行设置view->when(view){isTextView->view.textColor=Color.RED}}
3.Anko Layouts通常我们使用xml文件写我们的布局 。但是他有一些缺点如不是类型安全 。不是空安全 。解析xml文件消耗更多的cpu和电量等等 。而Anko Layout可以使用DSL(Domain Specific Language)动态创建我们的UI 。并且它比我们使用Java动态创建布局方便很多主要是更简洁 。它和拥有xml创建布局的层级关系 。能让我们更容易阅读 。(官方说的优点)
举个栗子:
verticalLayout{valname=editText()button("SayHello"){onClick{toast("Hello,${name.text}!")}}}
上面的代码是不是很简单易懂 。当然 。默认的控件并不能满足我们的需求 。例如我们会更改字体的颜色及大小 。会设置宽度和高度 。会设置margin 。padding值 。那么该如何实行呢 。当然也很简单 。因为它的逻辑和xml书写布局是一个套路 。例如以下实现
valtextView=textView("我是一个TextView"){textSize=sp(17).toFloat()textColor=0xff000.opaque}.lparams{margin=dip(10)height=dip(40)width=matchParent}
配合上前面Common库是不是很简单呢?
这里我们不需要setContentView 。直接写在onCreate方法中就行 。
在上面创建UI过程中 。我们直接把创建UI的代码写在onCreate方法中了 。当然 。还有一种写法 。我们创建一个内部类实行AnkoComponent接口 。并重写createView方法 。该方法返回一个View 。也就是我们创建的布局 。修改如下
classMyActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?,persistentState:PersistableBundle?){super.onCreate(savedInstanceState,persistentState)MyActivityUI().setContentView(this)}}classMyActivityUI:AnkoComponent<MyActivity>{overridefuncreateView(ui:AnkoContext<MyActivity>)=with(ui){verticalLayout{valname=editText()button("SayHello"){onClick{ctx.toast("Hello,${name.text}!")}}}}}
现在我们编译运行 。发现效果和布局文件写的界面是一样的 。但是它的性能是有优势的 。其实吧并没有发觉性能优势 。不管怎样 。这种DSL确实便于阅读 。也很容易上手 。在上面的代码中 。你可能注意到了dip(10),它表示将10dp转换为像素的意思 。是Anko的扩展函数 。说的扩展函数 。如果阅读过Anko的源码我们发现里面大量的使用扩展函数 。这也是Kotlin语言的优势之一 。
这里就简单介绍下Layout的使用和优点 。但是我想各位看官在实际开发中也不一定会用 。因为不可视化用起来实在难以接受 。不过这种见仁见智吧 。
4.Anko SQLite: a query DSL and parser collection for Android SQLite;Anko SQLite是一个查询解析SQLite的领域专用语言
SQLite 存在的不足:
  1. 过多需要实现的模板代码;
  2. 通过字符串实现 SQL 命令 。容易出错 。且编译时无法检查;
  3. 每次需要手动关闭数据库;
  4. 线程和同步访问的问题;
随着你应用的数据库越来越复杂 。暴露出来的问题也会越多 。所以也难怪很多人会选择 ORM 或者 NoSQL 。但这带来的方便性是以增加应用大小和方法数为代价的 。
如果你打算使用 Kotlin 来开发 Android 应用 。那么现在通过 Anko SQLite 就可以很方便的进行 SQLite 操作了 。比如可以告别麻烦的 Cursor 和 ContentValue、内置安全机制 。保证数据库在执行所有代码后能够关闭 。
通过继承 ManagedSQLiteOpenHelper 类来实现数据库帮助类 。推荐做法就是按照官方的实现:
classDatabaseHelper(ctx:Context):ManagedSQLiteOpenHelper(ctx,"LibraryDatabase",null,1){companionobject{privatevarinstance:DatabaseHelper?=null@SynchronizedfunInstance(context:Context):DatabaseHelper{if(instance==null){instance=DatabaseHelper(context.applicationContext)}returninstance!!}}overridefunonCreate(database:SQLiteDatabase){createTable(Book.TABLE_NAME,true,Book.COLUMN_IDtoINTEGER+PRIMARY_KEY,Book.COLUMN_TITLEtoTEXT,Book.COLUMN_AUTHORtoTEXT)}overridefunonUpgrade(database:SQLiteDatabase,oldVersion:Int,newVersion:Int){dropTable(Book.TABLE_NAME,true)}}
访问数据库的推荐做法是通过依赖注入 。或者为 Context 添加一个 extension:
valContext.database:DatabaseHelperget()=DatabaseHelper.Instance(applicationContext)
下面这是一个简单的 model 类:
dataclassBook(valid:Int,valtitle:String,valauthor:String){companionobject{valBook.COLUMN_ID="id"valTABLE_NAME="books"valCOLUMN_TITLE="title"valCOLUMN_AUTHOR="author"}}
当数据库准备好后 。就可以通过 use 方法来进行操作了 。比如:
database.use{insert(Book.TABLE_NAME,Book.COLUMN_IDto1,Book.COLUMN_TITLEto"2666",Book.COLUMN_AUTHORto"RobertoBolano")}
最后 。让我们来比较一下常见库的大小:
Android背景设置透明和半透明效果 android背景透明度怎么设置

文章插图

Android背景设置透明和半透明效果 android背景透明度怎么设置

文章插图
要注意这里 Anko SQLite 的依赖大小其实是包含了 Kotlin Runtim (method count: 6298, DEX size: 1117 KB) 和 Anko Commons module (method count: 982, DEX size: 174 KB) 的 。因此如果你是通过 Kotlin 来开发 。Anko SQLite 增加的大小其实并没有图表显示得那么多 。
因此 。如果你在使用 Kotlin 做开发并且数据库的复杂度不高 。首推 Anko SQLite 。但如果数据库结构非常复杂 。DAO 和 SQL 查询可能会变得很痛苦 。这时候 ORM 和 NoSQL 就是首选方案了 。
5.Anko Coroutines: utilities based on the kotlinx.coroutines library.Kotlin协程
协程本质上是一个轻量级的线程 。支持我们用同步写法写异步请求 。而不用Callback 。
doAsync(UI){valdata:Deferred<Data>=bg{//RunsinbackgroundgetData()}//ThiscodeisexecutedontheUIthreadshowData(data.await())}
我们可以用bg()在新的线程去做耗时操作 。等返回结果再在UI线程进行操作 。
具体协程教程我们可以看一下官方文档
Kotlin协程
6.总结Anko是Kotlin官方开发的一个让开发Android应用更快速更简单的Kotlin库,并且能让我们书写的代码更简单清楚更容易阅读 。
主要包含了以下几个部分 。
  1. Anko Commons: a lightweight library full of helpers for intents, dialogs, logging and so on;
  2. Anko Layouts: a fast and type-safe way to write dynamic Android layouts;
  3. Anko SQLite: a query DSL and parser collection for Android SQLite;
  4. Anko Coroutines: utilities based on the kotlinx.coroutines library.
Anko库用起来非常的简单方便 。里面设计到DSL和扩展函数 。