学习Android的第四天

目录

Android FrameLayout ( 帧布局 )

FrameLayout size 大小

FrameLayout 属性

Android GridLayout ( 网格布局 )

GridLayout 属性

计算器布局

Android AbsoluteLayout 绝对布局

AbsoluteLayout 四大控制属性


Android FrameLayout ( 帧布局 )

FrameLayout 是 Android 中的一个布局容器,用于在单个视图中显示一个子视图。它是一种简单的布局,所有的子视图都位于屏幕的左上角,并且彼此重叠。

FrameLayout 主要用于显示单个子视图或在子视图之间进行切换,例如用于片段(Fragments)的容器或者在底部显示一个浮动的按钮。

FrameLayout (帧布局) 有一个缺点就是没有任何的定位方式,所以应用的场景并不多。

FrameLayout size 大小

在 FrameLayout 中,它的大小通常由其最大的子控件决定。如果子控件的大小相同,那么后面添加的子控件会覆盖在前面的子控件之上。这种特性使得 FrameLayout 适用于显示单一视图或在不同的子视图之间进行切换的场景。

另外,FrameLayout 默认将子控件放置在左上角。可以通过 android:layout_gravity 属性来指定子控件的位置,将其放置在不同的位置。

android:layout_gravity 是一个布局参数,用于指定一个视图在其父容器中的对齐方式或者在 FrameLayout 中的重叠方式。该属性的值是一个位掩码,可以同时指定多个对齐方式。

以下是一些常用的 android:layout_gravity 的属性值及其含义:

  • center:将视图在父容器中水平和垂直方向上居中对齐。
  • center_horizontal:将视图在父容器中水平方向上居中对齐。
  • center_vertical:将视图在父容器中垂直方向上居中对齐。
  • top:将视图在父容器中顶部对齐。
  • bottom:将视图在父容器中底部对齐。
  • left:将视图在父容器中左侧对齐。
  • right:将视图在父容器中右侧对齐。
  • start:将视图在父容器中起始边对齐,根据文本方向,可能是左边或者右边。
  • end:将视图在父容器中结束边对齐,根据文本方向,可能是右边或者左边。
  • fill:视图填充整个父容器,水平和垂直方向都会被拉伸。
  • fill_horizontal:视图在水平方向上填充整个父容器。
  • fill_vertical:视图在垂直方向上填充整个父容器。
  • clip_vertical:在垂直方向上剪切视图,超出父容器的部分不可见。
  • clip_horizontal:在水平方向上剪切视图,超出父容器的部分不可见。
  • center|bottom:将视图在父容器中水平居中对齐,垂直方向上底部对齐。

以下是一个简单的示例,演示了 FrameLayout 中使用 android:layout_gravity 属性的情况:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <!-- 子控件1,位于左上角 -->
        <TextView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:background="#FFC107"
            android:text="左上角"/>

        <!-- 子控件2,位于底部中央 -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="底部中央"
            android:layout_gravity="bottom|center_horizontal"
            android:background="#2196F3"
            android:textColor="#ffffff"/>

        <!-- 子控件3,位于中央 -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="位于中央"
            android:layout_gravity="center"
            android:background="#9C27B0"
            android:textColor="#ffffff"
            />    
</FrameLayout>

运行结果:

FrameLayout 属性

FrameLayout 只有两个自有属性,它们分别是:

1、android:foreground:

  • 说明:设置帧布局容器的前景图像。
  • 前景图像是永远处于帧布局最上面的图像,不会被覆盖。可以是颜色、图片等。

2、android:foregroundGravity:

  • 说明:设置前景图像显示的位置。
  • 该属性用于指定前景图像在帧布局中的对齐方式,类似于 android:layout_gravity,但是专用于前景图像。例如,可以设置为 center、top、bottom 等值。

范例 

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 帧布局的内容 -->
    <TextView
        android:layout_width="500dp"
        android:layout_height="300dp"
        android:background="#00ff00" />
    <TextView
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:background="#ff0000" />
    <TextView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#00ffff" />

    <!-- 前景图像,例如遮罩层或者水印 -->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/meimei"
        android:foreground="@android:color/darker_gray"
        android:foregroundGravity="center"/>

</FrameLayout>

运行结果:

趣味实例

随手指点击而移动的图片

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mylayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="@drawable/bg" >
</FrameLayout>
MainActivity.java
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.app.Activity;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FrameLayout frame = (FrameLayout) findViewById(R.id.mylayout);
        final MeiMeiView meimei = new MeiMeiView(MainActivity.this);

        //为我们的妹子添加触摸事件监听器
        meimei.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                //设置妹子显示的位置
                meimei.bitmapX = event.getX() - 150;
                meimei.bitmapY = event.getY() - 150;
                //调用重绘方法
                meimei.invalidate();
                return true;
            }
        });

        frame.addView(meimei);
    }
}

 MeiMeiView.java

package com.example.myapplication;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;

public class MeiMeiView extends View {
    //定义相关变量,依次是妹子显示位置的X,Y坐标
    public float bitmapX;
    public float bitmapY;
    public MeiMeiView(Context context) {
        super(context);
        //设置妹子的起始坐标
        bitmapX = 0;
        bitmapY = 200;
    }

    //重写View类的onDraw()方法
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //创建,并且实例化 Paint 的对象
        Paint paint = new Paint();

        //根据图片生成位图对象
        Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.meimei);

        //绘制妹子
        canvas.drawBitmap(bitmap, bitmapX, bitmapY,paint);

        //判断图片是否回收,木有回收的话强制收回图片
        if(bitmap.isRecycled())
        {
            bitmap.recycle();
        }
    }
}

Android GridLayout ( 网格布局 )

GridLayout 是 Android 中一种非常灵活的布局容器,允许您以网格形式排列子视图。相比于 TableLayout,GridLayout 提供了更多的灵活性和自定义性。

GridLayout 的主要特性:

  • 自定义行和列:可以通过 rowCount 和 columnCount 属性来指定网格布局的行数和列数,决定了整个网格的大小。
  • 子视图的位置:可以使用 layout_row 和 layout_column 属性来直接指定子视图所在的行和列。行和列的索引从0开始。
  • 子视图横跨行和列:使用 layout_rowSpan 和 layout_columnSpan 属性可以指定子视图横跨的行数和列数。这使得可以创建跨越多个单元格的复杂布局。
  • 对齐方式:通过 layout_gravity 属性,可以指定子视图在其单元格内的对齐方式。例如,可以设置为 top, center, bottom, start, end 等。
  • 自适应大小:子视图可以根据内容自适应大小,也可以通过 layout_width 和 layout_height 属性进行设置。

GridLayout 属性

1、排列方式:

  • android:orientation:用于设置子组件的排列方式,可选值为 vertical(默认,垂直排列)或 horizontal(水平排列)。
  • android:gravity:用于设置子组件的排列方式,可选值包括 center(居中)、left(靠左)、right(靠右)、bottom(底部)等。如果需要同时使用多种排列方式,可以使用位运算符,例如 left|bottom。

2、设置网格布局的行和列:

  • android:rowCount:用于设置网格布局有几行。
  • android:columnCount:用于设置网格布局有几列。

3、设置组件所在的行或列:

  • android:layout_row:用于设置组件位于第几行。
  • android:layout_column:用于设置组件位于第几列。

4、设置组件跨越的行和列:

  • android:layout_rowSpan:用于设置组件跨越几行。
  • android:layout_columnSpan:用于设置组件跨越几列。

计算器布局

GridLayout 布局最经典的就是 计算器 了,这是一个天然的网格布局。

下面是具体代码:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:columnCount="4"
    android:orientation="horizontal"
    android:rowCount="6" >

    <TextView
        android:id="@+id/displayTextView"
        android:layout_columnSpan="4"
        android:layout_gravity="fill"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:background="#dddddd"
        android:text="0"
        android:textSize="50sp" />

    <Button
        android:id="@+id/buttonClear"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:text="清空" />

    <Button
        android:id="@+id/buttonBack"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:text="回退" />

    <Button
        android:id="@+id/button1"
        android:text="1" />

    <Button
        android:id="@+id/button2"
        android:text="2" />

    <Button
        android:id="@+id/button3"
        android:text="3" />

    <Button
        android:id="@+id/buttonPlus"
        android:text="+" />

    <Button
        android:id="@+id/button4"
        android:text="4" />

    <Button
        android:id="@+id/button5"
        android:text="5" />

    <Button
        android:id="@+id/button6"
        android:text="6" />

    <Button
        android:id="@+id/buttonMinus"
        android:layout_width="wrap_content"
        android:text="-" />

    <Button
        android:id="@+id/button7"
        android:text="7" />

    <Button
        android:id="@+id/button8"
        android:text="8" />

    <Button
        android:id="@+id/button9"
        android:text="9" />

    <Button
        android:id="@+id/buttonMultiply"
        android:text="*" />

    <Button
        android:id="@+id/button0"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:text="0" />

    <Button
        android:id="@+id/buttonDot"
        android:layout_width="wrap_content"
        android:text="." />

    <Button
        android:id="@+id/buttonDivide"
        android:text="/" />

    <Button
        android:id="@+id/buttonEquals"
        android:text="=" />

</GridLayout>

MainActivity.java

package com.example.myapplication;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private TextView displayTextView;
    private StringBuilder currentInput;
    private double operand1, operand2;
    private char operator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化变量
        displayTextView = findViewById(R.id.displayTextView);
        currentInput = new StringBuilder();

        // 为数字按钮设置点击侦听器
        setNumberButtonClickListener(R.id.button0);
        setNumberButtonClickListener(R.id.button1);
        setNumberButtonClickListener(R.id.button2);
        setNumberButtonClickListener(R.id.button3);
        setNumberButtonClickListener(R.id.button4);
        setNumberButtonClickListener(R.id.button5);
        setNumberButtonClickListener(R.id.button6);
        setNumberButtonClickListener(R.id.button7);
        setNumberButtonClickListener(R.id.button8);
        setNumberButtonClickListener(R.id.button9);

        // 为操作按钮设置点击侦听器
        setOperatorButtonClickListener(R.id.buttonPlus, '+');
        setOperatorButtonClickListener(R.id.buttonMinus, '-');
        setOperatorButtonClickListener(R.id.buttonMultiply, '*');
        setOperatorButtonClickListener(R.id.buttonDivide, '/');

        // 为清除按钮设置点击侦听器
        findViewById(R.id.buttonClear).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clearDisplay();
            }
        });

        // 为退回按钮设置点击侦听器
        findViewById(R.id.buttonBack).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removeLastDigit();
            }
        });

        // 设置等于按钮的点击监听器
        findViewById(R.id.buttonEquals).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                performCalculation();
            }
        });

        // 设置点按钮的点击监听器
        findViewById(R.id.buttonDot).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                appendDot();
            }
        });
    }

    private void setNumberButtonClickListener(int buttonId) {
        Button button = findViewById(buttonId);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                appendDigit(button.getText().toString());
            }
        });
    }

    private void setOperatorButtonClickListener(int buttonId, final char operator) {
        Button button = findViewById(buttonId);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setOperator(operator);
            }
        });
    }

    private void appendDigit(String digit) {
        currentInput.append(digit);
        updateDisplay();
    }

    private void appendDot() {
        if (!currentInput.toString().contains(".")) {
            currentInput.append(".");
            updateDisplay();
        }
    }

    private void setOperator(char op) {
        if (currentInput.length() > 0) {
            operand1 = Double.parseDouble(currentInput.toString());
            operator = op;
            clearDisplay();
        }
    }

    private void performCalculation() {
        if (currentInput.length() > 0) {
            operand2 = Double.parseDouble(currentInput.toString());
            double result = 0;

            switch (operator) {
                case '+':
                    result = operand1 + operand2;
                    break;
                case '-':
                    result = operand1 - operand2;
                    break;
                case '*':
                    result = operand1 * operand2;
                    break;
                case '/':
                    if (operand2 != 0) {
                        result = operand1 / operand2;
                    } else {
                        // 处理除以零
                        clearDisplay();
                        displayTextView.setText("Error");
                        return;
                    }
                    break;
            }

            clearDisplay();
            currentInput.append(result);
            updateDisplay();
        }
    }

    private void removeLastDigit() {
        if (currentInput.length() > 0) {
            currentInput.deleteCharAt(currentInput.length() - 1);
            updateDisplay();
        }
    }

    private void clearDisplay() {
        currentInput.setLength(0);
        updateDisplay();
    }

    private void updateDisplay() {
        displayTextView.setText(currentInput.toString());
    }
}

注意: 如果想要让某个组件填满横越过的行或列,需要添加属性: android:layout_gravity = "fill"。

Android AbsoluteLayout 绝对布局

在Android中,AbsoluteLayout 是一种布局方式,它允许你使用绝对坐标来指定子视图的位置。然而,需要注意的是,AbsoluteLayout 已经被弃用(deprecated)了,因为它存在一些问题,例如不同屏幕尺寸和密度可能导致布局混乱。

推荐使用更灵活的布局方式,如 RelativeLayout、LinearLayout、ConstraintLayout 等,以便更好地适应不同设备和屏幕尺寸。

AbsoluteLayout 四大控制属性

在 Android 中,AbsoluteLayout 使用了四个主要的属性来控制子视图的位置和大小。这些属性如下:

  • android:layout_width: 用于设置组件的宽度。可以使用具体的数值,如 100dp,或者使用 wrap_content、match_parent 等常用值。
  • android:layout_height: 用于设置组件的高度。同样可以使用具体的数值或者常用值,如 wrap_content、match_parent。
  • android:layout_x: 设置组件的 X 坐标,即水平位置。以 dp 作为尺寸单位,指定组件左边缘距离父容器左边缘的距离。
  • android:layout_y: 设置组件的 Y 坐标,即垂直位置。同样以 dp 作为尺寸单位,指定组件顶部边缘距离父容器顶部边缘的距离。

例子:

尽管 AbsoluteLayout 已经被弃用,但还是可以提供一个示例,以演示其用法。请注意,为了更好的屏幕适应性和灵活性,强烈建议使用更现代的布局方式!!!!!!。如 ConstraintLayout 或 RelativeLayout。

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="16dp"
        android:layout_y="135dp"
        android:text="用 户 名"
        tools:layout_editor_absoluteX="36dp"
        tools:layout_editor_absoluteY="64dp" />

    <EditText
        android:id="@+id/login_email"
        android:layout_width="256dp"
        android:layout_height="wrap_content"
        android:layout_x="64dp"
        android:layout_y="123dp"
        android:inputType="textEmailAddress"
        tools:layout_editor_absoluteX="124dp"
        tools:layout_editor_absoluteY="64dp" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="16dp"
        android:layout_y="193dp"
        android:text="密 码"
        tools:layout_editor_absoluteX="36dp"
        tools:layout_editor_absoluteY="82dp" />

    <EditText
        android:id="@+id/login_password"
        android:layout_width="256dp"
        android:layout_height="wrap_content"
        android:layout_x="64dp"
        android:layout_y="180dp"
        android:inputType="textPassword"
        tools:layout_editor_absoluteX="124dp"
        tools:layout_editor_absoluteY="87dp" />

    <Button
        android:id="@+id/login_btn"
        android:layout_width="256dp"
        android:layout_height="wrap_content"
        android:layout_x="63dp"
        android:layout_y="247dp"
        android:text="登 陆"
        tools:layout_editor_absoluteX="145dp"
        tools:layout_editor_absoluteY="271dp" />

</AbsoluteLayout>

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/372685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

家政小程序系统开发:从构思到实现

随着科技的快速发展&#xff0c;移动互联网已经深入到我们生活的方方面面。特别是在家政服务领域&#xff0c;传统的服务方式已经不能满足现代人的需求。因此&#xff0c;开发一款家政小程序系统显得尤为重要。本文将介绍家政小程序系统的开发过程&#xff0c;包括需求分析、设…

SQLserver2008 r2 下载安装配置、使用、新建登录用户及通过Navicat远程连接

目录 一、下载 二、安装配置 1.安装 2.许可条款 3.安装程序支持文件 4.功能选择 5.实例配置 6.服务器配置 7.数据库引擎配置 8.Reporting Services 配置 9.安装进度 ​编辑 10.完成 三、使用 四、新建登录用户 1.新建登录名 2.常规 3.服务器角色 4. 用户映…

算法学习——LeetCode力扣链表篇1

算法学习——LeetCode力扣链表篇1 203. 移除链表元素 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 示例 …

thinkphp数据批量提交(群发消息)

<form id="edit-form" class="form-horizontal" role="form" data-toggle<

Verilog实现2进制码与BCD码的互相转换

1、什么是BCD码&#xff1f; BCD码是一种2进制的数字编码形式&#xff0c;用4位2进制数来表示1位10进制中的0~9这10个数。这种编码技术&#xff0c;最常用于会计系统的设计里&#xff0c;因为会计制度经常需要对很长的数字做准确的计算。相对于一般的浮点式记数法&#xff0c;…

Camera2+OpenGL ES+MediaCodec+AudioRecord实现录制音视频写入H264 SEI数据

记录一下学习过程&#xff0c;得到一个需求是基于Camera2OpenGL ESMediaCodecAudioRecord实现录制音视频。 需求&#xff1a; 在每一帧视频数据中&#xff0c;写入SEI额外数据&#xff0c;方便后期解码时获得每一帧中的自定义数据。点击录制功能后&#xff0c;录制的是前N秒至…

RCS系统之:显示AGV预测路线

在AGV做业务过程中&#xff0c;常会看到AGV一直停在哪里&#xff0c;没有任何动作。所以显示AGV马上要行进的路线非常有必要。 好处有&#xff1a; AGV是否有任务&#xff0c;AGV是否已经规划出路线&#xff1b;AGV马上要行进的路线 那具体要如何实现呢&#xff1f;有兴趣的可…

ONLYOFFICE:一站式办公,探索高效办公新境界

写在前面ONLYOFFICE 介绍ONLYOFFICE 有哪些优势ONLYOFFICE 文档 8.0 发布如何体验 ONLYOFFICEONLYOFFICE 文档部分页面截图 写在前面 在当今这样一个数字化时代&#xff0c;办公软件已经成为我们日常工作中不可或缺的一部分&#xff0c;熟练使用 Office、WPS、腾讯文档、金山文…

如何在Mac上允许主流浏览器使用弹出式窗口?这里有详细步骤

这篇文章教你如何关闭流行的Mac浏览器上的弹出窗口阻止程序,包括Safari、Chrome和Firefox。它还探讨了你可能希望这样做的原因及其影响。 如何在Mac上允许Safari使用弹出窗口 如果你经常在Mac上使用Safari,你会注意到默认情况下弹出窗口阻止程序是打开的。有时,这并不方便…

[office] 教你实现Excel中工作表重命名的诀窍 #知识分享#职场发展#其他

教你实现Excel中工作表重命名的诀窍 在Excel中要实现工作表的重命名其实不是难事&#xff0c;重在你要掌握技巧。一些初学者&#xff0c;可能还不是特别的懂。今天&#xff0c;小编就要一步步来教一下大家了。有两种方法&#xff0c;大家学好了。 方法一、打开excel表格&#x…

YOLOv8改进 | 检测头篇 | 重参数化检测头RepHead解决困难样本检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是RepHead,该检测头为我独家全网首发,该检测头由重参数化模块组成,加大对于特征学习的能力,却可以不增加GFLOPs(仅仅略微提升)从而不影响模型的推理速度和性能,保持较高的FPS能力,牺牲了少量GFLOPs的情况下确提高了模型的特征提…

进程和线程的区别详解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 进程 进程在系统中是如何管理的 进一步认识PCB 线程 能否一直增加线程数目来提高效率 进程和线程…

极狐GitLab 与钉钉的集成实践

DingTalk OAuth 2.0 OmniAuth provider * 引入于 14.5 版本。 您可以使用您的钉钉账号登录极狐GitLab。 登录钉钉开放平台&#xff0c;创建应用。钉钉会生成一个客户端 ID 和密钥供您使用。 登录钉钉开放平台。 在顶部栏上&#xff0c;选择 应用程序开发 > 企业内部开发&am…

数据挖掘实战-基于决策树算法构建北京市空气质量预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

看论文利器:paperswithcode

paperswithcode&#xff0c;从名字就可以看出来&#xff0c;有源代码的paper。 写论文&#xff0c;很关键的就是能够复现论文内容。 这个网站提供了“论文代码”的参考文献。 以【图像加密】领域为例&#xff0c;搜索一下&#xff1a; 图像分割&#xff1a; 除了论文&#x…

2024.2.5日总结(小程序开发2)

小程序的宿主环境 宿主环境 宿主环境指的是程序运行所必须的依赖环境。 Android系统和iOS系统是两个不同的宿主环境。安卓版的微信App不能再iOS环境下运行。Android是安卓软件的宿主环境&#xff0c;脱离了宿主环境的软件是没有意义的。 小程序的宿主环境 手机微信是小程序…

Uibot (RPA设计软件)智能识别信息+微信群发助手(升级版)———课后练习1

微信群发助手机器人的小项目友友们可以参考小北的课前材料二博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北的前两篇博客&#xff0c;友友们我们即将开展新课的学习~RPA 培训前期准备指南——安装Uibot(RPA设计软件&#x…

jmeter-问题一:关于线程组,线程数,用户数详解

文章目录 jmeter参数介绍1.线程数2.准备时长(Ramp-up)3.循环次数4.same user on each iteratio5.调度器 场景一&#xff1a;当你的线程组中线程数为1,循环为1场景二&#xff1a;当你的线程组中线程数为2&#xff0c;循环为1场景三&#xff1a;当你的线程组中线程数为1&#xff…

Javascript | 打印菱形

Javascript打印菱形&#xff0c;在校大学生可以拿来糊弄作业&#xff08;笑&#xff09; var str ; for (var i 1; i < 9; i) {if (i < 5) {for (var k1 1; k1 < 5 - i; k1) {str ;}} else {for (var k2 1; k2 < i - 5; k2) {str ;}}if (i < 5) {for (…

升级Oracle 单实例数据库19.3到19.22

需求 我的Oracle Database Vagrant Box初始版本为19.3&#xff0c;需要升级到最新的RU&#xff0c;当前为19.22。 以下操作时间为为2024年2月5日。 补丁下载 补丁下载文档参见MOS文档&#xff1a;Primary Note for Database Proactive Patch Program (Doc ID 888.1)。 补丁…