学校开了一门移动应用开发课程,我一开始兴趣盎然,但是看到使用的环境是 Java 8 的时候心就凉了一半,在询问老师的意见之后决定使用现在比较常用的Android Studio完成学习,特此记录自学之路。
目录
1. 控件2. 通用属性2.1. 通用属性介绍2.2. 通用属性实例 3. TextView3.1. 属性介绍3.2. 实战演练3.2.1. 小说界面实例3.2.2. 单行跑马灯实例 4. EditText4.1. 属性介绍4.2. 登录界面 5. Button6. ImageView6.1. 属性介绍6.2. 实例 7. ProgressBar7.1. 属性介绍7.2. 实例1. 控件
安卓的控件还是比较丰富的,有文本控件、图片控件、对话框、按钮、进度条等控件。上述控件在安卓中分别为:
TextViewImageViewEditViewButtonProgressBar
2. 通用属性
2.1. 通用属性介绍
一些通用属性整理
2.2. 通用属性实例
做一个用户登录界面,丑是丑了点,但是功能都用到了。
uiviews_test.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg"android:gravity="center_horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Sign Up"android:textSize="40sp"android:textColor="#dddddd"android:layout_marginTop="40dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="It's a love story\nBaby just say yes"android:textSize="24sp"android:textColor="#dddddd"android:gravity="center_horizontal"android:layout_marginTop="30dp"/><ImageViewandroid:layout_width="70dp"android:layout_height="70dp"android:src="@mipmap/ic_launcher"android:layout_margin="30dp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="10dp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="20dp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="20dp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="20dp"/><ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Register"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="30dp"android:src="@drawable/button"/></LinearLayout>
效果如下
3. TextView
3.1. 属性介绍
一些常用的属性
3.2. 实战演练
这边放两个实战演练,分别针对单行和多行文字的情况。
3.2.1. 小说界面实例
先创一个TextActivity.java
使用滚动条布局,显示之前存好的文字。
配置文件AndroidManifest.xml
如下:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"xmlns:tools="/tools"package="com.example.myapplication"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="false" /><activityandroid:name=".TextActivity"android:exported="true"><intent-filter><!-- 启动界面 --><action android:name="android.intent.action.MAIN" /><!-- 在应用列表形成图标 --><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
activity_text.xml
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".TextActivity"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/love_story"android:textSize="22sp"android:textColor="#222222"android:lineSpacingExtra="10sp"android:lineSpacingMultiplier="1.2"/></ScrollView>
效果如下:
关于滚动条布局,有一点需要注意。滚动条布局种不允许出现两个TextView,程序会崩溃。当然,如果你硬要加俩,那要在俩TextView外套一个其他布局。
3.2.2. 单行跑马灯实例
TextView也支持单行显示文字,我们在此演示单行显示love story,并用完成跑马灯效果。
activity_text2.xml
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><!-- android:ellipsize="marquee" 跑马灯效果--><!-- android:focusable="true"可以获取焦点--><!-- android:focusableInTouchMode="true"在碰触时也可以获取焦点--><!-- android:marqueeRepeatLimit="marquee_forever"一直执行跑马灯--><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/love_story"android:textSize="22sp"android:textColor="#222222"android:singleLine="true"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:marqueeRepeatLimit="marquee_forever"android:paddingLeft="4dp"android:paddingRight="4dp"/></ScrollView>
效果如下:
4. EditText
4.1. 属性介绍
一些常用的属性
4.2. 登录界面
我们完成一个登录界面,用到输入框的多个属性。
uiviews_test.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg"android:gravity="center_horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Sign Up"android:textSize="40sp"android:textColor="#dddddd"android:layout_marginTop="40dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="It's a love story\nBaby just say yes"android:textSize="24sp"android:textColor="#dddddd"android:gravity="center"android:layout_marginTop="30dp"/><ImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:src="@mipmap/ic_launcher"android:layout_margin="30dp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:gravity="center"android:textColorHint="#000000"android:hint="User Name"android:textSize="20sp"android:inputType="text"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="20dp"android:hint="Email Address"android:textSize="20sp"android:gravity="center"android:textColorHint="#000000"android:inputType="numberSigned|numberDecimal"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="20dp"android:gravity="center"android:textColorHint="#000000"android:hint="Phone"android:textSize="20sp"android:inputType="phone"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="20dp"android:hint="Password"android:textSize="20sp"android:gravity="center_horizontal"android:textColorHint="#000000"android:inputType="textPassword"android:maxLength="15"/><ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Register"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="30dp"android:src="@drawable/button"/></LinearLayout>
效果如下:
5. Button
使用button控件时需要注册点击事件,一般有四种方式:
自定义内部类(java实现)匿名内部类当前Activity去实现事件接口在xml布局文件中添加点击事件属性
思想就是我们有这么一个接口,然后想要实现它,那要么就是自定义实现,要么在控件内实现,要么就是整个类直接调用接口;不然就只能在xml中实现了。直接说比较抽象,直接上代码。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"xmlns:tools="/tools"package="com.example.myapplication"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="false" /><activityandroid:name=".TextActivity"android:exported="false" /><activityandroid:name=".ButtonActivity"android:exported="true"><intent-filter><!-- 启动界面 --><action android:name="android.intent.action.MAIN" /><!-- 在应用列表形成图标 --><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
activity_button.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".ButtonActivity"><Buttonandroid:id="@+id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="自定义内部类"/><Buttonandroid:id="@+id/btn2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="匿名内部类"/><Buttonandroid:id="@+id/btn3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Activity实现接口"/><Buttonandroid:id="@+id/btn4"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="xml文件绑定"android:onClick="btn4Click"/></LinearLayout>
ButtonActivity.java
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;public class ButtonActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_button);// 根据id找到btn1Button btn1 = findViewById(R.id.btn1);//实例化点击事件MyClassListener mcl = new MyClassListener();// 点击触发事件btn1.setOnClickListener(mcl);Button btn2 = findViewById(R.id.btn2);// 2. 匿名类btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 在控制台输出语句Log.e("TAG","匿名类完成,挺方便的");}});Button btn3 = findViewById(R.id.btn3);btn3.setOnClickListener(this);}// 3. 直接在当前activity实现接口@Overridepublic void onClick(View view) {Log.e("TAG","用本类实现activity");}// 1. 自定义内部类class MyClassListener implements View.OnClickListener{@Overridepublic void onClick(View v){// 在控制台输出语句Log.e("TAG","自定义内部类完成,一般用于多个按钮功能相似的情况");}}// 4. xml绑定。方法一定是public,名字一定一样。// v代表的是被点击的控件对象,可以是按钮也可以是文本之类的。// 不用写setOnClickListener了public void btn4Click(View v){Log.e("TAG","xml绑定事件");}}
点击后输出结果如下:
6. ImageView
个人感觉图像的操作没啥,基本上就是放大缩小旋转,再高级的直接用PS去修改图片源就好了。
6.1. 属性介绍
这边提一嘴mipmap文件夹和drawable文件夹的区别和联系。
联系:两者都是用来存图片文件的。区别:mipmap其实也是一种技术,简单来说,图片放到mipmap文件夹中,缩放时不容易掉帧。个人建议直接放mipmap文件夹。
6.2. 实例
一般图片的一些操作都涉及到动画,不太适合演示给初学者,这边演示下前景与背景。其实没什么特别大的作用,就是来体验一下什么叫前景什么叫背景。
imageview_front_back.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/bg"android:gravity="center_horizontal"><ImageButtonandroid:layout_width="wrap_content"android:layout_height="400dp"android:layout_margin="5dp"android:background="#ff0000"android:src="@mipmap/button"/></LinearLayout>
效果如下,丑是真的丑。
7. ProgressBar
7.1. 属性介绍
一些属性。
7.2. 实例
放了几种操作属性的实例,并完成了通过Java线程设置操纵进度条进度实例。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"xmlns:tools="/tools"package="com.example.myapplication"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="false" /><activityandroid:name=".ButtonActivity"android:exported="false" /><activityandroid:name=".TextActivity"android:exported="false" /><activityandroid:name=".ProgressBarActivity"android:exported="true"><intent-filter><!-- 启动界面 --><action android:name="android.intent.action.MAIN" /><!-- 在应用列表形成图标 --><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
activity_progress_bar.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ProgressBarActivity"><ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"/><ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"android:progress="30"android:max="60"/><ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"android:indeterminate="true"/><ProgressBarandroid:id="@+id/progress"android:layout_width="match_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal" /></LinearLayout>
ProgressBarActivity.java
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.widget.ProgressBar;public class ProgressBarActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_progress_bar);ProgressBar progress = findViewById(R.id.progress);progress.setProgress(80);// 4.0的安卓版本之后是不能在线程中操控控件的,除了进度条new Thread() {public void run(){for (int i = 1; i <= 100; i++) {progress.setProgress(i);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}}
效果如下: