本文是哔哩哔哩上 安卓开发教程 的笔记

UI的概念:

就是用户界面的意思

① View

下面是官方的翻译

This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for widgets, which are used to create interactive UI components (buttons, text fields, etc.). The android.view.ViewGroup subclass is the base class for layouts, which are invisible containers that hold other Views (or other ViewGroups) and define their layout properties

这个类代表着一个基本的建造阻止对用户的接口来讲.一个接口充满了一个矩阵的地区.View是这个基本的类对窗口来讲,一个用来创造可交互的UI组件.

ViewGroups是他的子类,定义为他们的布局的属性

注意:

View类位于android.view的包中,但是View的子类一般位于android.widget类包中

例如:

import android.view.View;    //Viewimport android.widget.TextView;   //View的子类

View类的属性:

① id

android:id 标识属性

id就是这个View类的名字,以后再给这个View类创建监听什么的时候用得到的一个标识

例子如下:

android:id="@+id/textView"

② background

android:background 背景属性

设置这个View类的背景,可以是颜色,也可以是图片

方法分别如下:

android:background="@drawable/a123"
android:background="#770000"

③ padding

android:padding  属性
     android:paddingStart="24dp"android:paddingTop="24dp"android:paddingEnd="24dp"android:paddingBottom="24dp"

这四个分别是

左 上 右 下

他们描述的是内边距

一个完整的例子如下:

android:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="120dp"android:layout_marginTop="296dp"android:background="#771111"android:paddingStart="10dp"android:paddingTop="50dp"android:paddingEnd="50dp"android:paddingBottom="24dp"

② ViewGroup

代表的是一个具体的容器

ViewGroup.LayoutParams 控制其子组件分布时,依赖的内部类

​ ① ViewGroup.LayoutParams类

​ ② ViewGroup.MarginLayoutParams类

ViewGroup.LayoutParams类

常用的有

高度和宽度的属性

android:layout_width=""
android:layout_height=""

① 可以设置为具体的数值

android:layout_width="100dp"
android:layout_height="200dp"

② 可以设置为

match_parent

wrap_content

还有一个有点过时了,这里不表

match_parent表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小

wrap_content表示让当前的控件大小能够刚好包含里面的内容,也就是由控件内容决定当前控件的大小

ViewGroup.MarginLayoutParams

主要是用来控制,子组件的外边距的

具体的属性如下图所示

Android UI组件的层次结构

③ 选择控制UI界面的方法

​ ① 使用XML布局文件来控制UI界面(推荐)

​ ② 再JAVA代码中控制UI界面

​ ③ 使用XML和Java代码混合控制UI界面

​ ④ 开发自定义的View

使用XML布局文件来控制UI界面

​ ① 再Android应用的res/layout 目录下编写XML布局文件

​ ② 再Activity中使用以下Java代码显示XMl文件中的内容

setContentView(R.layout.activity_main);

使用Java代码来控制UI界面

这个我们通过一个实例,来讲解

下面是MainActivity

package com.example.demo_03;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//创建一个布局管理器FrameLayout frameLayout = new FrameLayout(this);//设置背景图片frameLayout.setBackgroundResource(R.mipmap.abc);//把这个布局管理器,添加到这个Activity里面setContentView(frameLayout);//文本框组件TextView textView = new TextView(this);//设置文本框属性textView.setText("开始游戏");textView.setTextSize(TypedValue.COMPLEX_UNIT_SP,18);textView.setTextColor(Color.rgb(17,85,114));FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);//设置文本框居中显示params.gravity = Gravity.CENTER;textView.setLayoutParams(params);//设置一个监听对象textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new AlertDialog.Builder(MainActivity.this).setTitle("系统提示").setMessage("游戏有风险,进入需要谨慎,真的要进入吗").setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Log.i("WARN","桌面台球,进入游戏");}}).setNegativeButton("退出", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Log.i("WARN","桌面台球,退出游戏");finish();}}).show();      //显示对话框}});frameLayout.addView(textView);                             // 将text1添加到布局管理器中}
}

使用XMl和Java代码混合控制UI界面

我们将一般组件的代码放到XML中,将复杂组件的代码放到Java中

下面还是一个实例

① 首先,我们创建一个默认的Demo

② 然后,我们在更改其中的默认文件,也就是activity_main里面的内容

②-① 我们先将他的布局管理器改为 GridLayout(网格布局管理器)
②-② 然后我们在添加 id 属性 和排列属性(orientation) 排列属性改为 horizontal(水平)
②-③ 然后我们在吧行和列添加进去 rowCount columnCount

添加完毕后的结果如下:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/layout"android:orientation="horizontal"android:rowCount="3"android:columnCount="4"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=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></GridLayout>

③ 我们更改MainActivity.java里面的内容

package com.example.demo_04;import androidx.appcompat.app.AppCompatActivity;import android.media.Image;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.ViewGroup;
import android.widget.GridLayout;
import android.widget.ImageView;public class MainActivity extends AppCompatActivity {//创建一个ImageView的数组,用来保存图像private ImageView[] img = new ImageView[12];//int数组,用来记录,图片的地址//R.mipmap就是图片的地址private int[] imagePath = new int[]{R.mipmap.img01,R.mipmap.img02,R.mipmap.img03,R.mipmap.img04,R.mipmap.img05,R.mipmap.img06,R.mipmap.img07,R.mipmap.img08,R.mipmap.img09,R.mipmap.img10,R.mipmap.img11,R.mipmap.img12,};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取到图片文件,并且添加到网格布局管理器中//findViewByID 是一个蛮复杂的方法,这里暂时,先跳过GridLayout layout = findViewById(R.id.layout);//设置图片的循环for(int i=0;i<imagePath.length;i++){//context就是环境,应该是放在哪里的意思img[i]=new ImageView(MainActivity.this);//setImageResource就是设置一个图片,进去   drawable 属性就是静态的图片属性//setImageResource可能会出现问题,现在已经推荐使用别的了//具体的地址This does Bitmap reading and decoding on the UI thread, which can cause a latency hiccup. If that's a concern, consider using setImageDrawable(android.graphics.drawable.Drawable) or setImageBitmap(android.graphics.Bitmap) and BitmapFactory insteadimg[i].setImageResource(imagePath[i]);//设置内边距img[i].setPadding(2,2,2,2);//设置图片的宽度和高度ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(300,200);//讲这个宽度和高度,应用于这些图片img[i].setLayoutParams(params);//把这些图片添加到layout 布局管理器中layout.addView(img[i]);}}
}

开发自定义的View

虽然安卓已经有许多定义好的View类供我们使用,但是在实际的开发中,还是不能满足我们的实际需求,所以我们还是需要自己开发View组件

① 在XML布局文件里面 添加一个FrameLayout布局管理器

② 然后再Java类里面创建View类组件—这个类要继承View类

③ 再主程序里面实例化那个Java类(继承了View类的)

下面是一个实例

① 先把需要使用的资源文件房进去

② 改写布局文件

activty_main

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"android:background="@mipmap/background"android:id="@+id/mylayout"tools:context=".MainActivity"></FrameLayout>

③ 添加一个自定义的View类 Sister

package com.example.demo_05;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 SisterView  extends View {//这两个值,分别是X,Y的坐标public  float bitmapX;public  float bitmapY;@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//创建一个画笔对象Paint paint = new Paint();//Bitmap是一个位图对象   后面的那个方法,返回的就是一个bitmap的对象Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),R.mipmap.sister);//canvas是画布类,用来保存位图的//drawBitmap这个方法的作用是在图片的左上方绘制图片//canvas.drawBitmap(bitmap,bitmapX,bitmapY,paint);//改了哈,代码,让图片可以居中绘制.canvas.drawBitmap(bitmap, bitmapX - bitmap.getWidth() / 2, bitmapY - bitmap.getHeight() / 2, paint);//强制回收图片if(bitmap.isRecycled()){bitmap.recycle();}}//自动重写构造方法public SisterView(Context context) {super(context);bitmapX =290;bitmapY =130;}}

④ 主程序里面的方法

package com.example.demo_05;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 SisterView  extends View {//这两个值,分别是X,Y的坐标public  float bitmapX;public  float bitmapY;@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//创建一个画笔对象Paint paint = new Paint();//Bitmap是一个位图对象   后面的那个方法,返回的就是一个bitmap的对象Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),R.mipmap.sister);//canvas是画布类,用来保存位图的//drawBitmap这个方法的作用是在图片的左上方绘制图片//canvas.drawBitmap(bitmap,bitmapX,bitmapY,paint);//改了哈,代码,让图片可以居中绘制.canvas.drawBitmap(bitmap, bitmapX - bitmap.getWidth() / 2, bitmapY - bitmap.getHeight() / 2, paint);//强制回收图片if(bitmap.isRecycled()){bitmap.recycle();}}//自动重写构造方法public SisterView(Context context) {super(context);bitmapX =290;bitmapY =130;}}

在记录一个Small Trips吧

在绘制图像的时候,因为

canvas.drawBitmap()默认的绘制方向是左上角,

如果我们想要图像以中心为坐标的话,就相当于,把原来的图像向左上角移动

所以我们要减去

图如下:

安卓开发笔记-UI设计的概念相关推荐

  1. 暑假小学期安卓开发笔记1——设计思路

    最近小学期到了,内容是开发一个带有服务的app,如果写得好的话,还可以十月份参加华为杯. 其他组开发的东西各式各样,有弄小说阅读器的,有弄英语单词背写的,还有弄英语情景对话的.我们小组弄的是基于番茄钟 ...

  2. Android实战开发--小慕笔记UI设计(Fragment布局的使用)

    目录 前言 一.需求 二.主要步骤 1.Fragment容器操作 2.封装删除工具类 三.关键代码 四.效果展示 前言 本项目为安卓基础实战开发,利用Fragment进行小慕笔记UI设计,学习之前需要 ...

  3. 安卓开发笔记——打造属于自己的博客园APP(一)

    最近事情比较多,博客更新又落下了,平时有个习惯,喜欢睡前看看博客园里博友的文章,但一直感觉APP市场上下载下来的博客园客户端用起来并不是很舒服,近来发现博客园也有对外开放的数据接口,所以打算自己写个博 ...

  4. Windows phone 应用开发[3]-UI 设计

    本篇来谈谈Windows phone UI设计.这个有点让我痛苦的话题. 其实谈到移动平台的设计.原来没有实际接触Windows phone 产品开发工作时对UI设计这个概念不是特别强烈. 并没有感到 ...

  5. 软件开发全套视频教程汇总(javaSE,javaEE,linux,android开发,C# ,web前端,大数据云计算,数据挖掘,web前端,php开发,UI设计,C++开发,3D视频)

    软件开发全套视频教程汇总(javaSE,javaEE,linux,android开发,C# ,web前端,大数据云计算,数据挖掘,web前端,php开发,UI设计,C++开发,3D视频) 这是我以前学 ...

  6. lua搭建ui_Unity游戏开发笔记-UI框架之Lua层封装-上篇

    现在的商业游戏开发,业务层绝大多数都是在Lua层实现.UI作为业务一哥,首当其冲.上一篇文章我们讲了UI框架在C#层的封装,这篇文章核心介绍下在Lua层的封装.还有之前遗留的几个问题数据层和显示层的抽 ...

  7. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  8. ui设计和python哪个容易学_软件开发和ui设计那个容易学?

    感谢邀请,以下是我的一些亲身经历,想和大家分享. 真心的!建议哪怕是念完一个普通高中,也比现在直接去学那些职业技能要好,学历高一点,你面对的选择.能做的选择也会更多一些,能够拓宽你未来的职业路. 初中 ...

  9. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

最新文章

  1. 104-string和StringBuilder的区别
  2. Sunscreen(POJ-3416)
  3. 如何导出源文件_正骨室001期 | 如何避免色彩损失
  4. SCI科技论文写作、投稿与发表(一)
  5. Javascript高级程序设计——函数声明与函数表达式的区别
  6. 关于单反相机中的APS-C
  7. Vue动态组件异步组件
  8. python读取文件格式化方法
  9. 浅析帧、帧数、帧率、FPS区别
  10. 2018年阿里巴巴重要开源项目汇总(持续更新中)
  11. margin的百分比参照物
  12. word恢复默认样式
  13. 13、腾讯云轻量应用服务器挂载文件系统
  14. 毫米和像素怎么换算_将mm换算为px (毫米换算为像素)
  15. python数据处理工具-Pandas笔记
  16. 写笔记插件_梁宝川:这11条anki插件的使用常识分享给你
  17. 使用Nightwatch.js做基于浏览器的web应用自动测试
  18. 照片后期制作计算机配置,追求色彩真实还原,图片后期处理电脑配置推荐
  19. php快速计算子网掩码的前缀长度
  20. 2000-2020全国及31省城投债数据

热门文章

  1. luogu1941 飞扬的小鸟
  2. Nginx 源码编译安装配置
  3. 传华硕将在6月3日闪现EBox台式电脑
  4. 广州市天河区2021-2022学年八年级第一学期期末考试英语试题
  5. 神经网络模型大小怎么看,神经网络模型大小计算
  6. 中医四大经典著作之一《神农本草经》
  7. 数据结构堆Heap实现思路
  8. CSS中IE和火狐对margin、padding的兼容性解析
  9. 51单片机入门 - 并行I/O口扩展实例(74LS244/74LS373/4071)
  10. 隐马尔模型----四