2021-07-17

做demo:

画画板 记事本 食物商城

使用kotlin开发完整项目

需要技术:

Navigation组件:https://blog.csdn.net/wangzhaung/article/details/103062735
safe args传值
ROOM DATABASE
Data bingding绑定适配
RecyclerView数据搜索、数据排序
LiveData
ViewModel
Repository
网格布局、瀑布布局
RecyclerView搜索
客户端-服务器端交互
Dagger-Hilt
Retrofit
Offline Cache离线缓存
kotlin Coroutines协程
LiveData

食物api:https://spoonacular.com/food-api

xml和项目关联:把layout的id给到主函数:setContentView(R.layout.activity_main)

**LinearLayout,RelativeLayout,ConstraintLayout
通过TextView在主函数获取xml的内容

一、用代码写控件

——在MainAcitivity中用代码写demo而不是design:
context中getResources方法


代码中获取属性

创建容器,需要传入context上下文

改变颜色
设置颜色
设置颜色

如果min SDK不符合版本,在Gradle Script——build.gradle更改即可(第二个)


更改min-SDK
设置颜色

代码中需要的是dp,但写的是px
dp=px*屏幕密度

东哥 12:01:39
class MainActivity : AppCompatActivity() {
    @SuppressLint("UseCompatLoadingForDrawables")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //创建一个容器 LinearLayout,RelativeLayout,ConstraintLayout
        var container = LinearLayout(this)
        //设置容器的尺寸 宽度和高度
        var mLayoutParams = LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT
        )
        container.layoutParams = mLayoutParams
        //设置排列方向
        container.orientation = LinearLayout.VERTICAL
        //设置颜色
        container.background = getDrawable(R.color.purple_200)
        //关联容器
        setContentView(container)

        //创建你一个LinearLayout容器 图片和标题
        var head = LinearLayout(this).apply {
            //布局参数
            layoutParams = LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
            )
            orientation = LinearLayout.HORIZONTAL
            background = getDrawable(R.color.white)
            weightSum = 2f
        }

        //添加图片
        ImageView(this).apply {
            //设置尺寸
            layoutParams = ViewGroup.LayoutParams(
                dp2px(120),dp2px(100))
            scaleType = ImageView.ScaleType.CENTER_CROP
            //设置图片
            setImageResource(R.drawable.dance)
            //添加到容器中
            head.addView(this)
        }

        //添加标题
        TextView(this).apply {
            //设置尺寸
            layoutParams = ViewGroup.MarginLayoutParams(
                dp2px(210),dp2px(100)).apply {
                    leftMargin = dp2px(30)
            }

            text = "参考消息网7月29日报道美国消费者新闻与商业频道网站近日发表美国退役四星上将、布鲁金斯学会会长约翰·艾伦和布鲁金斯学会治理研究中心副主任达雷尔·韦斯特的文章称,部署基于人工智能的武器有重大机遇,但也存在日益增加的重大威胁。虽然人工智能可以放大军事能力,但它也可能在本质上破坏稳定。文章摘编如下:\n" +
                    "\n" +
                    "美国最近派遣两个航母战斗群进入南海,以显示军事实力。这一举动是回应中国在南海水域举行军事演习。当中美这两个“超级大国”都在人工智能、远程成像和无人化武器系统方面发展先进技术能力之际,这场对峙加剧了全球紧张关系。重要的是,两国官员都应明白,新兴技术能够加快决策过程,但同时也会加大误判的风险。"
            setTextColor(getColor(R.color.black))
            //添加到容器中
            head.addView(this)
        }

        //将这个容器添加到外部容器中
        container.addView(head)
        
        //Activity 生命周期 跳转(自己的界面 系统) 传值
        
    }

    //将dp值转化为px
    fun dp2px(dp:Int):Int{
        Log.v("pxd","${resources.displayMetrics.density}")
        return (resources.displayMetrics.density * dp).toInt()
    }

    
}

东哥 15:02:50
class MainActivity : AppCompatActivity() {
    lateinit var container:ConstraintLayout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        createContainer()
        setContentView(container)
        addChilds()
    }

    @SuppressLint("ResourceType")
    fun createContainer(){
        container = ConstraintLayout(this).apply {
            layoutParams = ConstraintLayout.LayoutParams(
                ConstraintLayout.LayoutParams.MATCH_PARENT,
                ConstraintLayout.LayoutParams.MATCH_PARENT
            )
            background = getDrawable(R.color.purple_200)
            id = resources.getInteger(R.id.mContainer)
        }
    }

    @SuppressLint("ResourceType")
    fun addChilds(){
        //图片
        ImageView(this).apply {
            layoutParams = ConstraintLayout.LayoutParams(
                dp2px(120),dp2px(100)).apply {
                    startToStart = resources.getInteger(R.id.mContainer)
                    topToTop = resources.getInteger(R.id.mContainer)
                leftMargin = dp2px(16)
                topMargin = dp2px(16)
            }
            setImageResource(R.drawable.dance)
            scaleType = ImageView.ScaleType.CENTER_CROP
            container.addView(this)
        }

        //标题
        //新闻内容
    }

    //将dp值转化为px
    fun dp2px(dp:Int):Int{
        Log.v("pxd","${resources.displayMetrics.density}")
        return (resources.displayMetrics.density * dp).toInt()
    }
}

二、Acitivity窗口

每一个容器都有LayoutParams
avtivity详解:https://www.jianshu.com/p/fb44584daee3

Acitivity的生命周期

BootLoader-》系统-》启动管理手机页面的进程-》SystemService!AcitivityManagerService-》Lauch-》调用onclick方法-》startApp-》ActivityThread-》创建application-》activity-》显示

lauch和relauch

ActivityClientRecord r,会记录上一次登入的记录

输出语句log:调试用,暴力输出:
v:Verbose,tag是用来过滤信息的,msg要输出的信息
i:Info
e: Error
w: Warn
响应用户的触摸事件:Down、Move、Up、Cancel

三、页面调转:

使用方法:onTouchEvent,motionEvent:

if(event.action== MotionEvent.ACTION_DOWN UP){
}
触摸方法

Intent意图
显示意图:当前程序内部的页面
隐式意图:跳转到其他系统或其他App的页面
在MainAcitivity:触摸一下跳转到SecondAcicitivity(下图)


首页

跳转界面

四、总结

手动创建控件(容器、子控件)
LinearLayout.LayoutParams
ConstraintLayout.LayoutParams

dp density密度 px

onCreate
onStart onRestart
onResume

onPause
onStop
onDestory

创建Activity
手动创建一个类继承于AppCompatActivity()
-重写onCreate方法
-创建layout文件
-关联xml文件
-manifest中注册

getResource(resource)获取系统的资源 文本,颜色,图片
getDrawable(id)
getColor(id)
getString(id)

触摸事件onTouchEvent(event:MotionEvent)
event.action == MotionEvent.ACTION_DOWN UP MOVE CANCEL

启动页面:startActivity-finish
intent:显示意图 (此,彼class.java)

Log.v("tag","内容")
Logcat日志查看 verbose error

你可能感兴趣的:(2021-07-17)