AndroidStudio-常见界面控件

一、Button

java 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class Review01Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review01)
        
        val button = findViewById<Button>(R.id.btn_01)
        button.setOnClickListener{
            button.text = "按钮被点击"
        }

    }
}

另一种实现方法:

java 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.TextView

class Review01Activity : AppCompatActivity(), View.OnClickListener {
    lateinit var button: Button
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review01)

        button = findViewById(R.id.btn_01)
        button.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        if(v != null){
            when (v.id) {
                R.id.btn_01 -> {
                    button.text = "按钮被点击"
                }
                else -> {
                }
            }
        }
    }
}

二、EditView

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Review03Activity">
    
    <EditText
        android:id="@+id/edit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="请输入账号"
        android:textSize="17sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@+id/edit_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:inputType="numberPassword"
        android:textSize="17sp"
        app:layout_constraintTop_toBottomOf="@+id/edit_name"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>
java 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.EditText

class Review03Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review03)

        val edit_name = findViewById<EditText>(R.id.edit_name)
        edit_name.text
    }
}

三、ImageView

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Review04Activity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@drawable/sgqt01"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

四、RadioButton

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Review05Activity">

    <RadioGroup
        android:id="@+id/rbtn_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints">
        <RadioButton
            android:id="@+id/rbtn_01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="男"/>
        <RadioButton
            android:id="@+id/rbtn_02"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="女"/>

    </RadioGroup>


</androidx.constraintlayout.widget.ConstraintLayout>
Kotlin 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.RadioButton

class Review05Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review05)

        val rbtn_1 = findViewById<RadioButton>(R.id.rbtn_01)
        rbtn_1.setOnCheckedChangeListener { compoundButton,b ->
            println(compoundButton.id)
            println(R.id.rbtn_01)
            println(b)
        }
    }
}

五、CheckBox

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请选择你的兴趣爱好"/>
    <CheckBox
        android:id="@+id/cb_01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="舞蹈"/>
    <CheckBox
        android:id="@+id/cb_02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="表演"/>
    <CheckBox
        android:id="@+id/cb_03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="音乐"/>

</LinearLayout>
Kotlin 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.CheckBox
import android.widget.TextView

class Review07Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review07)

        val cb_1 = findViewById<CheckBox>(R.id.cb_01);
        val cb_2 = findViewById<CheckBox>(R.id.cb_02);
        val cb_3 = findViewById<CheckBox>(R.id.cb_03);
        val textView = findViewById<TextView>(R.id.tv_cb)

        cb_1.setOnCheckedChangeListener { compoundButton, b ->
            if (b) textView.text = "你选择了${compoundButton.text}"
        }
        cb_2.setOnCheckedChangeListener { compoundButton, b ->
            if (b) textView.text = "你选择了${compoundButton.text}"
        }
        cb_3.setOnCheckedChangeListener { compoundButton, b ->
            if (b) textView.text = "你选择了${compoundButton.text}"
        }
    }
}

六、Toast

安卓中的Toast是一种简单的用户界面提示工具,用于在屏幕上显示短暂的消息。它通常用于向用户显示一些短暂的信息,比如操作成功、警告或者错误提示。Toast消息会以浮动窗口的形式出现在屏幕上方或下方,持续一段时间后自动消失,不会打断用户的操作。Toast通常用于在应用程序中提供一种简单的反馈机制。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请选择你的兴趣爱好"/>
    <CheckBox
        android:id="@+id/cb_01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="舞蹈"/>
    <CheckBox
        android:id="@+id/cb_02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="表演"/>
    <CheckBox
        android:id="@+id/cb_03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="音乐"/>

</LinearLayout>
Kotlin 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.CheckBox
import android.widget.TextView
import android.widget.Toast

class Review08Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review08)

        val cb_1 = findViewById<CheckBox>(R.id.cb_01)
        val cb_2 = findViewById<CheckBox>(R.id.cb_02)
        val cb_3 = findViewById<CheckBox>(R.id.cb_03)
        val textView = findViewById<TextView>(R.id.tv_cb)

        cb_1.setOnCheckedChangeListener { compoundButton, b ->
            if(b)
                Toast.makeText(this,compoundButton.text,Toast.LENGTH_SHORT).show()
        }
    }
}

七、AlertDialog

1.普通对话框

安卓中的AlertDialog是一个常用的对话框组件,用于在应用程序中浮动显示一些信息、进行简单的交互或者请求用户确认某些操作。它通常包含一个图标和标题、一个消息内容和一些按钮选项,比如确认、取消等。开发者可以使用AlertDialog来向用户展示信息,例如警告、错误提示或者确认对话框等。

Kotlin 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog

class Review09Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review09)

        val backPressedDispatcher = this.onBackPressedDispatcher
        //创建一个onBackPressedCallback
        val callback = object :OnBackPressedCallback(true){
            override fun handleOnBackPressed() {
                //创建AlterDialog.Builder 实例
                runOnUiThread {
                    val builder = AlertDialog.Builder(this@Review09Activity)
                    //设置对话框标题和消息
                    builder.setTitle("普通对话框")
                        .setMessage("是否退出应用?")
                        .setPositiveButton("确定") { dialog, which ->
                            dialog.dismiss()
                            this@Review09Activity.finish()
                        }
                        .setNegativeButton("取消"){dialog,which ->
                            dialog.dismiss()
                        }
                    //创建并显示AlterDialog
                    val dialog = builder.create()
                    dialog.show()
                }
                }
        }
        //将OnBackPressedCallback添加到OnBackPressedDispatcher
        backPressedDispatcher.addCallback(callback)
    }
}

应该是显示这样一个对话框但是我的没有显示。。。

2.单选对话框

单选对话框提供单选项目,如下所示,点击单选框后修改字体大小

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Review10Activity">

    <TextView
        android:id="@+id/tv_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

    <Button
        android:id="@+id/btn_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮"
        android:textSize="17sp"
        app:layout_constraintTop_toBottomOf="@+id/tv_dialog"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

  </androidx.constraintlayout.widget.ConstraintLayout>
Kotlin 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AlertDialog

class Review10Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review10)

        val btn = findViewById<Button>(R.id.btn_dialog)
        val tv = findViewById<TextView>(R.id.tv_dialog)

        btn.setOnClickListener {
            val builder = AlertDialog.Builder(this)

            val items = arrayOf("小号","中号","大号")
            builder.setTitle("单选对话框")
                .setSingleChoiceItems(items,-1) { dialog,which ->
                    btn.textSize = (which + 1) * 15f
                    tv.textSize = (which + 1) * 15f
                    dialog.dismiss() //关闭对话框
                }
            val dialog = builder.create()
            dialog.show()
        }
    }
}

builder.setSingleChoiceItems 用于设置一个单选列表,用户可以从中选择一个项。第一个参数是列表项,第二个参数是默认选中的项(这里是 -1,表示没有默认选中任何项),第三个参数是选择项时的监听器。

在回调函数中,我们根据选中的项 which 设置按钮和文本视图的字体大小,计算公式是 (which + 1) * 15f。这样,选择第一个选项时字体大小是 15f,第二个是 30f,第三个是 45f

dialog.dismiss() 会关闭对话框。

3.复选对话框

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Review10Activity">

    <TextView
        android:id="@+id/tv_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

    <Button
        android:id="@+id/btn_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮"
        android:textSize="17sp"
        app:layout_constraintTop_toBottomOf="@+id/tv_dialog"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>
Kotlin 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AlertDialog

class Review12Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review12)
        val btn = findViewById<Button>(R.id.btn_dialog)
        val tv = findViewById<TextView>(R.id.tv_dialog)

        btn.setOnClickListener {
            val builder = AlertDialog.Builder(this)
            val items = arrayOf("阅读","唱歌","跳舞","戏曲")
            val checkedItems = booleanArrayOf(false,false,false,false)
            builder.setTitle("复选对话框").setMultiChoiceItems(items,checkedItems){ dialog,which,isChecked ->
                checkedItems[which] = isChecked
            }.setPositiveButton("确定") { dialog,which ->
                var hobby = "您的爱好是:"
                for (i in items.indices){
                    if (checkedItems[i]) {
                        hobby += items[i] + " "
                    }
                }
                tv.text = hobby
                dialog.dismiss()
            }
            val dialog = builder.create()
            dialog.show()
        }
    }
}

八、ListView

安卓中的ListView是一种常用的UI组件,用于在应用中展示可滚动的列表数据,允许用户通过滑动屏幕来查看列表中的项目,并且可以在列表中显示复杂的数据。ListView可以以垂直或水平方向滚动,并且可以自定义每个列表项的外观和行为。 通常,ListView与Adapter结合使用,Adapter负责将数据绑定到ListView上,以便正确显示列表项。 在较新的安卓开发中,RecyclerView通常被认为是更灵活和性能更好的选择,尤其是在处理大量数据或需要更复杂布局的情况下。

ListView必须通过适配器才能添加数据,适配器是ListView和数据之前的桥梁。这么做的目的是为了能够实现视图和数据的分离。有三种常用的Adapter:

1.BaseAdapter

一个抽象类,需要自定义一个子类来实现它,并实现一系列抽象方法来定义数据源和列表项的展示逻辑:

getCount(): 返回适配器中数据项的总数

getItem(int position): 返回指定位置的数据项

getItemId(int position): 返回指定位置的数据项的唯一标识符

getView(int position, View convertView, ViewGroup parent): 创建或获取指定位置的列表项视图。用于将数据绑定到视图上,并返回给列表进行显示。

2、3.SimpleAdapter和ArrayAdapter:

SimpleAdapter相对较为简单,适用于简单的列表数据展示,但对于复杂的列表项布局和交互较难满足。ArrayAdapter更灵活,可以直接将数组或List中的数据绑定到ListView,更方便地控制列表项的显示和交互。

SimpleAdapter适用于将不同类型的数据以键值对的形式展示在ListView中,例如将文本、图像等混合展示在列表项中。ArrayAdapter适用于将单一类型的数据集合(例如字符串、对象等)展示在ListView中。

以ArrayAdapter为例,展示如何通过其连接数据和ListView: 1)确定要展示的数据,即stringList 2)通过数据、adapter中每个项目的视图、上下文创建Adapter对象

注: ArrayAdapter默认使用的布局文件是系统提供的简单列表项布局 android.R.layout.simple_list_item_1,只包含一个 TextView 用于显示文本。如果需要展示复杂的效果,需要自行编写xml布局文件。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Review13Activity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:listSelector="#fefefe"
        android:scrollbars="none"/>

</LinearLayout>
Kotlin 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView

class Review13Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review13)

        val lv = findViewById<ListView>(R.id.lv)
        //创建一个字符串列表
        val stringList = listOf("蒋敦豪","鹭卓","李耕耘","李昊","赵一博","卓沅","赵小童","何浩楠","陈少熙","王一珩")
        //创建ArrayAdapter将字符串列表与ListView相连接
        val adapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,stringList)
        lv.adapter = adapter
    }
}

九、RecyclerView

RecyclerView是安卓中用于展示大量数据的高性能列表控件,是ListView的升级版。相比于ListView,RecyclerView更加灵活、高效,提供了更多的定制和扩展功能。

灵活的布局管理器(LayoutManager):RecyclerView允许开发者使用不同的布局管理器来控制列表项的排列方式,例如垂直列表、水平列表、网格布局等,这使得RecyclerView适用于各种不同的布局需求。

ViewHolder模式:RecyclerView使用了ViewHolder模式来重用列表项视图,这样可以大大提高列表性能,避免频繁创建和销毁视图。

局部刷新:RecyclerView支持局部刷新,可以针对列表中的某一项或某几项进行刷新,而不需要刷新整个列表,提高了刷新效率。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Review14Activity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

  </androidx.constraintlayout.widget.ConstraintLayout>
Kotlin 复制代码
package com.example.review01

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.homework03.Item

data class Item(val text:String ,val imageResourse:Int)

class Review14Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_review14)

        val itemList = listOf(
            Item("蒋敦豪",R.drawable.jdh),
            Item("鹭卓",R.drawable.lz),
            Item("李耕耘",R.drawable.lgy),
            Item("李昊",R.drawable.lh),
            Item("赵一博",R.drawable.zyb),
            Item("卓沅",R.drawable.zy),
            Item("赵小童",R.drawable.zxt),
            Item("何浩楠",R.drawable.hhn),
            Item("陈少熙",R.drawable.csx),
            Item("王一珩",R.drawable.wyh)
        )
        val recyclerView: RecyclerView = findViewById(R.id.lv)
        val layoutManager = LinearLayoutManager(this)
        val adapter = MyAdapter(itemList)
        recyclerView.layoutManager = layoutManager
        recyclerView.adapter = adapter
    }

    class MyAdapter(private val items: List<Item>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

        inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
            val textView: TextView = itemView.findViewById(com.example.homework03.R.id.test52_tv)
            val imageView: ImageView = itemView.findViewById(com.example.homework03.R.id.test52_iv)
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            // 使用新的布局文件 item_layout.xml
            val view = LayoutInflater.from(parent.context).inflate(com.example.homework03.R.layout.item_layout, parent, false)
            return ViewHolder(view)
        }

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val item = items[position]
            holder.textView.text = item.text
            holder.imageView.setImageResource(item.img)
        }

        override fun getItemCount(): Int {
            return items.size
        }
    }

}
相关推荐
安卓理事人20 小时前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学21 小时前
Android M3U8视频播放器
android·音视频
q***57741 天前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober1 天前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿1 天前
关于ObjectAnimator
android
zhangphil1 天前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我1 天前
从头写一个自己的app
android·前端·flutter
lichong9511 天前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端
用户69371750013841 天前
14.Kotlin 类:类的形态(一):抽象类 (Abstract Class)
android·后端·kotlin
火柴就是我1 天前
NekoBoxForAndroid 编译libcore.aar
android