ããã«ã¡ã¯ãHabrïŒ GoogleãGoogle I / O 2017ã§KotlinãAndroidã®å
¬åŒéçºèšèªãšããŠçºè¡šããŠããã»ãŒ9ãæãçµéããŸããã 誰ãããããã¡ã€ã³ããŒã«ãšããŠãã£ãšé·ã䜿ã£ãŠããŸããã2014幎åã°ããæžãããŠããå¯èœæ§ãããããã§ãã Googleã®ããã¥ã¡ã³ãã«ãKotlinã§ã®å®è£
ã®äŸãç»å Žãå§ããŸããã ãã®éãéçºè
ã¯ãã®èšèªã®ãã¹ãŠã®å©ç¹ãã觊ã£ãŠãè©äŸ¡ããããšãã§ããŸããã ãããŠãç§ãå«ãå€ãã®äººãã次ã®ã¹ãããã¯äœã ãšæããŸãããïŒ Kotlinã®ãµããŒãã©ã€ãã©ãªïŒ ãŸãã¯äœãæ°ãããã®ã§ããïŒ äŒããŸãããïŒAndroid KTXïŒ ãããŠãåæã«æ§ããããèšäºã®ç¿»èš³ãããªãã®æ³šæã«æ瀺ããŸãã

2æ5æ¥ãGoogleã¯Android KTXã©ã€ãã©ãªã®ãªãªãŒã¹ãçºè¡šããŸãããããã¯ãAndroidçšã¢ããªã±ãŒã·ã§ã³ãéçºããããã®Kotlinæ¡åŒµæ©èœã®ã»ããã§ãã ãã®ã¹ãããã¯ãKotlinã®Androidéçºãžã®çµ±åã®è«ççç¶ç¶ã®ããã«èŠããã³ãŒãã®åæžããã楜ããããããžã§ã¯ãã³ãŒãã®ç解ã®å®¹æããªã©ã®ãã¹ãŠã®å©ç¹ãè¿œå ããŸãã
çŸåšãã©ã€ãã©ãªã¯ãã¬ãã¥ãŒã§ã®ã¿å©çšå¯èœã§ãããæ°ããã¢ã€ãã¢ãåãå
¥ããŠããŸãã æãå¯èœæ§ãé«ãã®ã¯ãå®å®ããŒãžã§ã³ã«ç§»è¡ãããšãã«ã倧å¹
ã«å€ãã®æ©èœãšæ©èœãåããŠããããšã§ãã ç§ã¯ããã¥ã¡ã³ããèªã¿ãªãããã®èšäºãæžããŸããããããã€ãã®ç¹ã詳ããèŠãŠã¿ããšãããšæããŸããã ã»ãšãã©ã®å Žåãããªãèªèº«ãå¿
èŠãªãšãã«ã ãããã¥ã¡ã³ãã®åŠç¿ãéå§ããŸãã ããããç§ã¯ãã®èšäºãããªããä»äœã䜿çšã§ãããã«ã€ããŠã®ã¢ã€ãã¢ãæäŸããŠãããããšãé¡ã£ãŠããŸãã ãŸã Kotlinã䜿çšããŠããªãå Žåã¯ãäžè¶³ããŠãããã®ãç解ã§ããŸãã
KTXã®ããã¥ã¡ã³ãã¯
core-ktxã«ãããã©ã€ãã©ãªèªäœã¯
android / android-ktxã«ãããŸãã
ã¢ãã¡ãŒã·ã§ã³ã«é¢é£ããæ¡åŒµæ©èœã¯æ¬¡ã®ãšããã§ãã çŸåšã®ãªãªãŒã¹ã§å©çšå¯èœãªãã®ãç°¡åã«èª¿ã¹ãŠã¿ãŸãããã
ã¢ãã¡ãŒã·ã§ã³ãªã¹ããŒ
éå§ããã«ã¯ãã¢ãã¡ãŒã·ã§ã³ãªã¹ããŒãã¢ãã¡ãŒã¿ãŒã«èšå®ããŸãã
animator.addListener { handleAnimation(it) }
ãã®èšèšã«ãããã¢ãã¡ãŒã·ã§ã³ã€ãã³ãã®ã³ãŒã«ããã¯ãåãåãããšãã§ããŸãã ãªã¹ããŒããã®ç¹å®ã®ã³ãŒã«ããã¯ã«æ¡åŒµé¢æ°ã䜿çšããããšãã§ããŸããåä¿¡ããé¢æ°ã®ã¿ãå®è£
ããå¿
èŠããããŸãã
animator.addListener( onEnd = {}, onStart = {}, onCancel = {}, onRepeat = {} )
ããã¯ãäžèŠã§äœ¿çšããªãã³ãŒã«ããã¯ã®å®è£
ããªããããã³ãŒãã倧å¹
ã«åæžãããŸãã
ã¢ãã¡ãŒã·ã§ã³ã€ãã³ãã®åå¥ã®ãªã¹ããŒ
ãªã¹ããŒãåã
ã®ã€ãã³ãã«èšå®ããæ©äŒããããŸããããšãã°ãaddListenerïŒïŒé¢æ°ãšåãæ¹æ³ã§ãpauseã€ãã³ãã«ãªã¹ããŒãè¿œå ã§ããŸãã
animator.addPauseListener { handleAnimation(it) }
åäžè¡ã®æ§æã䜿çšããŠãã¢ãã¡ãŒã·ã§ã³ã€ãã³ãã§ãªã¹ããŒãããã³ã°ããããããšãã§ããŸãã
animator.doOnPause { handleAnimation(it) } animator.doOnCancel { handleAnimation(it) } animator.doOnEnd { handleAnimation(it) } animator.doOnRepeat { handleAnimation(it) } animator.doOnStart { handleAnimation(it) } animator.doOnResume { handleAnimation(it) }
çŸåšJavaã䜿çšããŠããå ŽåãJavaãå®è£
ããããã«å¿
èŠãªã³ãŒãã®éãå°ãªããèªã¿ãããããšãããããŸãã
ããã§ã¯ãContentããã±ãŒãžã«è¿œå ãããæ¡åŒµæ©èœãèŠãŠãããŸãã ã·ã¹ãã ãµãŒãã¹ãååŸããå¿
èŠãããå Žåãæ¡åŒµæ©èœã§ãããè¡ãããšãã§ããŸãã
val alarmManager = systemService<AlarmManager>()
æ¡åŒµæ©èœã䜿çšããå Žåãã¹ã¿ã€ã«ä»ãå±æ§ãæ©èœããŸãã
context.withStyledAttributes(set = someAttributeSet, attrs = attributes, defStyleAttr = ..., defStyleRes = ...) { // - } context.withStyledAttributes(set = someAttributeSet, attrs = attributes) { // - }
SharedPreferencesã®æäœã®èšè¿°ã¯ãæ¡åŒµæ©èœã®ç·šéæ©èœã䜿çšããŠã§ããéãç°¡åã«ãªããŸããã
sharedPreferences.edit { putBoolean(key, value) }
contentValuesOfé¢æ°ã䜿çšããŠContentValuesã®ã€ã³ã¹ã¿ã³ã¹ãäœæããPairã€ã³ã¹ã¿ã³ã¹ãåŒæ°ãšããŠæž¡ãããšãã§ããŸãã
val contentValues = contentValuesOf(somePairs...)
KTXã¯ãæéã®æäœã«é¢é£ããæ¹æ³ã䜿çšããããšãææ¡ããŠããŸãã ããã«ãããã®ãèŠãŠã¿ãŸãããã
ããã§ãåçŽãªåŒã³åºãã§DayOfWeekãMonthãYearãIntå€ãšããŠååŸã§ããŸãã
DayOfWeek.FRIDAY.asInt() Month.APRIL.asInt() Year.now().asInt()
Durationã¯ã©ã¹ã«ã¯ãå©çšå¯èœãªããã€ãã®æ¡åŒµé¢æ°ããããŸãã
// val (seconds, nanoseconds) = Duration.ofSeconds(1) // val resultValue = Duration.ofSeconds(1) * 2 // val resultValue = Duration.ofSeconds(2) / 2 // val resultValue = -Duration.ofSeconds(2)
ããããã£InstantãLocalDataãLocalDateTimeãLocalTimeã¯ã次ã®æ¡åŒµé¢æ°ã«ãã£ãŠååŸã§ããŸãã
// val (seconds, nanoseconds) = Instant.now() // val (year, month, day) = LocalDate.now() // val (localDate, localTime) = LocalDateTime.now() // val (hour, minute, second, nanosecond) = LocalTime.now()
äžèšã®ã¡ãœãããšåæ§ã«ãMonthDayãOffsetDateTimeãããã³OffsetTimeã¯ã©ã¹ã®ããããã£ãžã®ã¢ã¯ã»ã¹ã¯ã次ã®ã¡ãœããã®åŒã³åºããéããŠååŸã§ããŸãã
// val (month, day) = MonthDay.now() // val (localDataTime, ZoneOffset) = OffsetDateTime.now() // val (localTime, ZoneOffset) = OffsetTime.now()
Periodã¯ã©ã¹ã䜿çšããå ŽåãKTXã©ã€ãã©ãªã«ã¯ããã®ã¯ã©ã¹ã®ããããã£ãšæäœã«ã¢ã¯ã»ã¹ããããã®ããã€ãã®æ¡åŒµé¢æ°ãå«ãŸããŠããŸãã
// val (years, month, days) = Period.ofDays(2) // val resultValue = Period.ofDays(2) * 2 // val resultValue = -Period.ofDays(2)
å¿
èŠãªå€ãååŸããããã«äœ¿çšã§ããããã€ãã®ä»ã®æ¡åŒµé¢æ°ããããŸãã
// val (year, month) = YearMonth.now() // val (localDateTime, ZoneId) = ZonedDateTime.now()
次ã®æ¡åŒµé¢æ°ã¯æ¬åœã«è¯ãè¿œå æ©èœã§ãããInt-valueãé¢æ°åŒã³åºãã«ãã£ãŠæäŸãããå¿
èŠãªã¯ã©ã¹ã«ç°¡åã«å€æã§ããŸãã
someInt.asDayOfWeek() // DayOfWeek someInt.asMonth() // Month someInt.asYear() // Year someInt.days() // Period someInt.hours() // Duration someInt.millis() // Duration someInt.minutes() // Duration someInt.months() // Period someInt.nanos() // Duration someInt.seconds() // Duration someInt.years() // Period
ããã¯Longå€ã«å¯ŸããŠãæ©èœããŸãïŒ
someLong.asEpochMillis() // Instant someLong.asEpochSeconds() // Instant someLong.hours() // Duration someLong.millis() // Duration someLong.minutes() // Duration someLong.nanos() // Duration someLong.seconds() // Duration
Android OSããã±ãŒãžãšã®ããåããç®çãšããæ¡åŒµæ©èœã¯æ¬¡ã®ãšããã§ãã
ãããã«ã¯ãHandlerã¯ã©ã¹ãæäœããããã®ããã€ãã®æ¡åŒµé¢æ°ãå«ãŸããŠããŸãã
handler.postAtTime(uptimeMillis = 200L) { // - } handler.postDelayed(delayInMillis = 200L) { // - }
Bundleã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®äœæã¯ãä»ã§ã¯ãã£ãšèŠæ ãããããªããŸããã
val bundle = bundleOf("some_key" to 12, "another_key" to 15) val bundle = persistableBundleOf("some_key" to 12, "another_key" to 15)
ãŸããSystraceããŒã«ã®ãã¬ãŒã¹ã€ãã³ããèšé²ãããšããã¬ãŒã¹ã¡ãã»ãŒãžã®èšé²ãããç°¡åã§çŸãããªããŸãã
trace("section_name") { }
Utilããã±ãŒãžã«ã¯ããã¡ã€ã«ãé
åãããã³ãã®ä»ã®åºæ¬çãªããŒã¿åãæäœããããã®æ¡åŒµæ©èœãå«ãŸããŠããŸãã
AtomicFilesã䜿çšããå Žåã次ã®é¢æ°ã䜿çšã§ããŸãã
val fileBytes = atomicFile.readBytes() val text = atomicFile.readText(charset = Charset.defaultCharset()) atomicFile.tryWrite {
LongSparseArray ã
SparseArray ã
SparseBooleanArray ã
SparseIntArray ã
SparseLongArrayåã«ã€ããŠã¯ãå©çšå¯èœã«ãªããŸããïŒ
array.contains(someKey) array.containsKey(someKey) array.containsValue(someValue) array.forEach { key, value -> doSomething(key, value) } array.getOrDefault(key = keyValue, defaultValue = defaultValue) array.getOrElse(key = keyValue, defaultValue = defaultValue) array.isEmpty() array.isNotEmpty() val keyIterator = array.keyIterator() val valueIterator = array.valueIterator() array.plus(anotherArray) array.putAll(anotherArray) array.remove(key = keyValue, value = value) array.set(key = keyValue, value = value) array.size
Pairã¯ã©ã¹ã®æäœãå°ãç°¡åã«ãªããŸããã
val pair = android.util.Pair("dsfn", "sdihfg") // val (key, value) = pair // Android Pair Kotlin Pair val kotlinPair = pair.toKotlinPair()
Kotlinãã¢ãAndroidãã¢ã«å€æããããšãã§ããŸãã
val pair = Pair("dsfn", "sdihfg") val androidPair = pair.toAndroidPair()
Halfã¯ã©ã¹ã䜿çšããå ŽåãKTXã®ãããã§ãä»ã®ã¿ã€ãã®ããŒã¿ãç°¡åã«å€æã§ããŸãã
short.toHalf() string.toHalf() float.toHalf() double.toHalf()
æ¡åŒµæ©èœã䜿çšããŠã
ClosedRangeã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã
Rangeã«å€æã§ããããã«ãªã
ãŸãã ã
val range = closedRange.toRange()
Rangeã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®äžã§ã次ã®ããšãã§ããããã«ãªããŸããã
val range = closedRange.toClosedRange() // val resultValue = closedRange and someOtherRange // , val resultValue = closedRange += someOtherCloseRange // val resultValue = closedRange += someValue
Sizeã¯ã©ã¹ãš
SizeFã¯ã©ã¹ã®äž¡æ¹ã§æ¡åŒµæ©èœã䜿çšã§ããŸãã
val size = Size(5, 5)
ãã®ã»ã¯ã·ã§ã³ã«ã¯ã
Cursorã¯ã©ã¹ã§äœ¿çšå¯èœãªæ¡åŒµé¢æ°ãå«ãŸããŠããŸãã æ©èœã®åã°ã«ãŒãã¯ã次ã®é åºã§é
眮ãããŸãã
- æåã®é¢æ°ã¯ãæå®ãããååã䜿çšããŠénullåãè¿ããŸãã
- 2çªç®ã®é¢æ°ã¯ãæå®ãããååã䜿çšããŠããŒã¿åïŒãŸãã¯nullïŒãè¿ããŸãã
- 3çªç®ã®é¢æ°ã¯ãæå®ãããã€ã³ããã¯ã¹ã䜿çšããŠããŒã¿åïŒãŸãã¯nullïŒãè¿ããŸãã
cursor.getBlob(columnName = "some_column") cursor.getBlobOrNull(columnName = "some_column") cursor.getBlobOrNull(index = 0) cursor.getDouble(columnName = "some_column") cursor.getDoubleOrNull(columnName = "some_column") cursor.getDoubleOrNull(index = 0) cursor.getFloat(columnName = "some_column") cursor.getFloatOrNull(columnName = "some_column") cursor.getFloatOrNull(index = 0) cursor.getInt(columnName = "some_column") cursor.getIntOrNull(columnName = "some_column") cursor.getIntOrNull(index = 0) cursor.getLong(columnName = "some_column") cursor.getLongOrNull(columnName = "some_column") cursor.getLongOrNull(index = 0) cursor.getShort(columnName = "some_column") cursor.getShortOrNull(columnName = "some_column") cursor.getShortOrNull(index = 0) cursor.getString(columnName = "some_column") cursor.getStringOrNull(columnName = "some_column") cursor.getStringOrNull(index = 0)
çŸæç¹ã§ã¯ãSQLiteã«ã¯1ã€ã®é¢æ°ãããããŸããããéåžžã«äŸ¿å©ã§ãã æå®ãããSQLã¹ããŒãã¡ã³ãã䜿çšããŠãã©ã³ã¶ã¯ã·ã§ã³ãäœæã§ããŸãã
sqLiteDatabase.transaction { "some SQL statement" }
ãªãœãŒã¹ã«é¢ããŠã¯ããããŸã§ã®ãšããã
TypedArrayã¯ã©ã¹ã§ã®äœæ¥ãç°¡çŽ åããæ¡åŒµæ©èœã®ã¿ãè¿œå ãããŠããŸãã
val boolean = typedArray.getBooleanOrThrow(0) val int = typedArray.getColorOrThrow(0) val colorStateList = typedArray.getColorStateListOrThrow(0) val float = typedArray.getDimensionOrThrow(0) val int = typedArray.getDimensionPixelOffsetOrThrow(0) val int = typedArray.getDimensionPixelSizeOrThrow(0) val drawable = typedArray.getDrawableOrThrow(0) val float = typedArray.getFloatOrThrow(0) val typeface = typedArray.getFontOrThrow(0) val int = typedArray.getIntOrThrow(0) val int = typedArray.getIntegerOrThrow(0) val string = typedArray.getStringOrThrow(0) val charSequenceArray = typedArray.getTextArrayOrThrow(0) val charSequence = typedArray.getTextOrThrow(0)
泚 ïŒæå®ãããã€ã³ããã¯ã¹ãååšããªãå Žåããã¹ãŠã®throwã¯
IllegalArgumentExceptionãã¹ããŒããŸãã
ç§ãã¡ïŒéçºè
ïŒãåãçµãã§ããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã¯ããããã®åãã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãå Žæã§ããã¹ãã䜿çšããŠããŸãã 幞ããªããšã«ãKTXã«ã¯ãç¹ã«
SpannableStringBuilderã¯ã©ã¹ã®ããã«ããããæäœããããã®ããã€ãã®é¢æ°ããããŸãã
ããšãã°ããã«ããŒã®åæåçŽåŸã«ããããã®é¢æ°ã䜿çšããŠãå
ã®è¡ã®æåŸã«å€ªåã®ããã¹ããè¿œå ã§ããŸãã
val builder = SpannableStringBuilder(urlString) .bold { append("hi there") }
èæ¯è²ãèšå®ããããããã¹ãã«ããã£ã³ã°ãè¿œå ãããã§ãããã«ãé¢æ°ããããŸãã
.backgroundColor(color = R.color.black) {
æåŸã®é¢æ°ã¯buildSpannedStringã§ããããã«ãããäžèšã®æ¡åŒµé¢æ°ã䜿çšããŠæååãäœæã§ããŸãã
textView.text = buildSpannedString { bold { append("hitherejoe") } }
.netããã±ãŒãžã«ã¯ãæååãURIã«ç°¡åã«å€æã§ãã1ã€ã®é¢æ°ããããŸãã å¿
èŠãªãã®ïŒ
val uri = urlString.toUri()
KTXã®ã°ã©ãã£ãã¯ããã±ãŒãžã¯éåžžã«å€§èŠæš¡ã§ããããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®èŠèŠçãªåŸ®åŠããç°¡åã«å®è£
ããããšãã§ããŸãã
ãŸããBitmapãïŒã ãã§ãªãïŒæ¬¡ã®ã¿ã€ãã«å€æããé¢æ°ã«æ³šç®ããããšæããŸãã
val adaptiveIcon = bitmap.toAdaptiveIcon() val drawable = bitmap.toDrawable(resources) val icon = bitmap.toIcon() val drawable = someInt.toDrawable() val icon = someByteArray.toIcon() val icon = someUri.toIcon() val colorDrawable = someColor.toDrawable() val bitmap = drawable.toBitmap(width = someWidth, height = someHeight, config = bitMapConfig)
次ã«ããããããããæäœããããã®äž»èŠãªæäœãæ€èšããŸãã
val bitmap = someBitmap.applyCanvas(block = { }) val colorInt = someBitmap.get(x, y) val bitmap = someBitmap.scale(width, height, filter = true) someBitmap.set(x, y, color)
ãŸãã
Canvasã§ã®äœæ¥ãã¯ããã«ç°¡åã«ãªããŸããã
canvas.withRotation(degrees, pivotX, pivotY) { // } canvas.withSave { // } canvas.withScale(x, y, pivotX, pivotY) { // } canvas.withSkew(x, y) { // } canvas.withTranslation(x, y) { // }
ãŸãã
Colorã«ã¯ããã€ãã®ã€ãããŒã·ã§ã³ããããŸãã
plusïŒïŒé¢æ°ã¯æ¬åœã«ã¯ãŒã«ã§ã2ã€ã®è²ãæ··ããŠæ··ããè²ãåŸãããšãã§ããŸãïŒ
ããã«ããããªãã¯ã¹ã®æäœãç°¡åã«ãªããŸããã ããã§ã2ã€ã®è¡åãä¹ç®ããŠãçµæãšããŠ1ã€ã®
Matrixãªããžã§ã¯ããååŸã§ããŸãã
// val resultMatrix = matrix * someOtherMatrix val values = matrix.values()
ãŸããé©åãªã¢ã¯ã·ã§ã³ãå®è¡ããããã«ãã©ã¡ãŒã¿ãŒãããã¯ã䜿çšããŠãrecordé¢æ°ãä»ããŠ
Pictureãæäœããããšãã§ããŸãã
val resultField = picture.record(width = someWidth, height = someHeight) {
drawableã®å¢çãå€æŽãããå Žåã¯ãupdateBoundsé¢æ°ãåŒã³åºããŠããã©ã¡ãŒã¿ãŒãšããŠãã£ã¡ã³ã·ã§ã³ãæž¡ãããšãã§ããŸãã
drawable.updateBounds(left = 16, top = 16, right = 16, bottom = 16)
ã·ã§ãŒããŒã§å€æãè¡ãå¿
èŠããããŸããïŒ åé¡ãããŸããïŒ
shader.transform {
PorterDuffã¯ã©ã¹ãæäœããããã®ããã€ãã®æ¡åŒµé¢æ°ããããŸãã
val porterDuffColorFilter = mode.toColorFilter(someColor) val porterDuffXfermode = mode.toXfermode()
Regionã¯ã©ã¹ã䜿çšããŠã次ã®é¢æ°ã䜿çšã§ããããã«ãªããŸããã
// someRegion Rect val region = someRegion and someRect // someRegion Region val region = someRegion and someRegion // someRegion Rect val region = someRegion - someRect // someRegion Region val region = someRegion - someRegion // someRegion Rect val region = someRegion or someRect // someRegion Region val region = someRegion or someRegion // someRegion Rect val region = someRegion + someRect // someRegion Region val region = someRegion + someRegion // someRegion Rect val region = someRegion xor someRect // someRegion Region val region = someRegion xor someRegion val boolean = someRegion.contains(somePoint) someRegion.forEach { doSomethingWithEachRect(it) } val iterator = someRegion.iterator() // someRegion Region val region = -someRegion
PointFã¯ã©ã¹ãè¿œå ãããããã€ãã®æ©èœãç°¡çŽ åãããŠããŸãã
val (x, y) = somePointF val pointF = somePointF - someOtherPointF val pointF = somePointF - someFloat val pointF = somePointF + somePointF val pointF = somePointF + someFloat val point = somePointF.toPoint() val pointF = -somePointF
åãããšã
Pointã¯ã©ã¹ã«ã䜿çšã§ããŸãã
val (x, y) = somePoint val point = somePoint - somePoint val point = somePoint - someFloat val point = somePoint +somePoint val point = somePoint + someFloat val point = somePoint.toPointF() val point = -somePoint
ãŸãã
Rectã¯ã©ã¹ã®å ŽåïŒ
val rect = someRect and anotherRect val (left, top, right, bottom) = someRect someRect.contains(somePoint) val region = someRect - anotherRect val rect = someRect - someInt val rect = someRect - somePoint val rect = someRect or someRect val rect = someRect + someRect val rect = someRect + someInt val rect = someRect + somePoint val rectF = someRect.toRectF() val region = someRect.toRegion() val region = someRect xor someRect
é©ãããšã¯ãããŸãããã
RectFã§ãå©çšå¯èœã§ãã
val rectF = someRectF and anotherRectF val (left, top, right, bottom) = somerectF someRectF.contains(somePoint) val region = someRectF - anotherRectF val rectF = someRectF - someInt val rectF = someRectF - somePoint val rectF = someRectF or someRect val rectF = someRectF + someRect val rectF = someRectF + someInt val rectF = someRectF + somePoint val rect = someRectF.toRect() val region = someRectF.toRegion() val reactF = someRectF.transform(someMatrix) val region = someRectF xor someRect
Pathã¯ã©ã¹ã䜿çšããå Žåã次ã®ãªãã·ã§ã³ã䜿çšã§ããŸãã
val path = somePath and anotherPath val path = somePath.flatten(error = 0.5f) val path = somePath - anotherPath val path = somePath or anotherPath val path = somePath + anotherPath val path = somePath xor anotherPath
ã°ã©ãã£ãã¯ã䜿çšããå ŽåãããŒã¿å
Intããã³
Longã䜿çšããå¯èœæ§ãéåžžã«é«ããªããŸãã Type Intã¯ãKTXã§æ¬¡ã®æ©èœãæäŸããŸãã
val alpha = int.alpha val blue = int.blue val green = int.green val red = int.red val luminance = int.luminance val (alphaComp, redComp, greenComp, blueComp) = someInt val color = someInt.toColor() val color = someInt.toColorLong()
äžæ¹ãLongåã«ã¯ãããã«ããã€ãã®é¢æ°ãå«ãŸããŠããŸãã
val alpha = long.alpha val blue = long.blue val green = long.green val red = long.red val luminance = long.luminance val (alphaComp, redComp, greenComp, blueComp) = someLong val color = someLong.toColor() val color = someLong.toColorInt() long.isSrgb long.isWideGamut long.colorSpace
ãããã£ãŠã
Transitionã¯ã©ã¹ã«å°éãããšãããã§ã¢ãã¡ãŒã·ã§ã³ãªã¹ããŒãšåæ§ã®æ¡åŒµæ©èœã䜿çšã§ããããšãããããŸãã
transition.addListener { doSomethingWithTransition(it) } transition.addListener( onEnd = {}, onStart = {}, onCancel = {}, onResume = {}, onPause = {} )
ãã ããåã
ã®ã³ãŒã«ããã¯ã®ã¡ãœããæ§æã«ã¯ããããªéãããããŸãã
transition.doOnCancel { } transition.doOnEnd { } transition.doOnPause { } transition.doOnResume { } transition.doOnStart { }
åæ§ã®æ©èœã
Viewã¯ã©ã¹ã«ãè¿œå ãããŸããã ã³ãŒã«ããã¯ã®èšå®ã¯éåžžã«æ確ã§ãã
view.doOnLayout { } view.doOnNextLayout { } view.doOnPreDraw { }
postDelayedã¡ãœãã
ãé¢æ°ãšããŠå©çšå¯èœã«ãªããŸããïŒ
view.postDelayed(delayInMillis = 200) {
postOnAnimationDelayedã¡ãœããã§ãåãããšã
èšããŸãã
view.postOnAnimationDelayed(delayInMillis = 200) {
Viewã®ããã£ã³ã°ã®æŽæ°ã¯ãã¯ããã«ç°¡åã§ç解ãããããã®ã«ãªããŸããããã®ãããããã€ãã®æ©èœãæäŸãããŸããã
view.setPadding(16) view.updatePadding(left = 16, right = 16, top = 16, bottom = 16) view.updatePaddingRelative( start = 16, end = 16, top = 16, bottom = 16)
ãã¥ãŒãããããããã«å€æããå¿
èŠãããå Žåã¯ã1è¡ã®ã³ãŒãã§å®è¡ã§ããŸãïŒ
val bitmap = view.toBitmap(config = bitmapConfig)
ããã€ãã®éåžžã«ã¯ãŒã«ãªæ¡åŒµæ©èœãViewGroupã«è¿œå ãããŸããã æ°ã«å
¥ã£ãŠããã ãããšæããŸãïŒ ããšãã°ãViewGroupã«ç¹å®ã®ãã¥ãŒãå«ãŸããŠãããã©ããã確èªããŸãã
val doesContain = viewGroup.contains(view)
åViewGroupã®ãµã€ã¯ã«ïŒãããåã§ããå ŽåïŒïŒ
viewGroup.forEach { doSomethingWithChild(it) } viewGroup.forEachIndexed { index, view -> doSomethingWithChild(index, view) }
Kotlinã¹ã¿ã€ã«ã®ç¹å®ã®ããžã·ã§ã³ã®åãžã®ã¢ã¯ã»ã¹ïŒ
val view = viewGroup[0]
MutableIteratorã®ã€ã³ã¹ã¿ã³ã¹ã®
ååŸ ïŒ
val viewGroupIterator = viewGroup.iterator()
ãããŠãViewGroupã䜿çšããä»ã®ããã€ãã®æäœïŒ
viewGroup.isEmpty() viewGroup.isNotEmpty() viewGroup.size // view viewgroup viewGroup -= view // view viewgroup viewGroup += view
Viewã®ããã£ã³ã°ãšåæ§ã«ã次ã®é¢æ°ã䜿çšããŠLayoutParamsã®ããŒãžã³ãè¿œå ã§ããŸãã
params.setMargins(16) params.updateMargins(left = 16, right = 16, top = 16, bottom = 16) params.updateMarginsRelative( start = 16, end = 16, top = 16, bottom = 16)
ãããã«
ã芧ã®ãšãããKTXã¯Androidã¢ããªã±ãŒã·ã§ã³ã®éçºã§Kotlinã䜿çšããããã®åŒ·åãªããŒã«ãæäŸããŸãã ç§ã®ãããžã§ã¯ãã§ãããã䜿çšã§ããããšãéåžžã«å¬ããæã£ãŠãããè¿ãå°æ¥ã«è¿œå ããããã®ã楜ãã¿ã«ããŠããŸãã