Android
2022-03-26 21:03:28 1 举报
AI智能生成
安卓开发常用的一些功能
作者其他创作
大纲/内容
控件<br>
<font color="#ffffff">TextView</font> 视图控件
阴影
<font color="#ffffff">shadowColor="#00000000"</font> 设置字体阴影颜色<br>
shadowRadius="0" 设置阴影模糊度
shadowDx="0" 水平移动<br>
shadowDy="0" 垂直移动<br>
singleLine="true" 内容单行显示<br>
focusable="true" 是否可以获取焦点<br>
focusableInTouchMode="true" 控制在触摸模式下是否可以聚焦
ellipsize="" 控制省略位置<br>
marqueeRepeatLimit="" 字幕动画重复次数<br>
clickable="true" 是否能点击单击<br>
requestFocus 请求焦点<br>
Button 按钮控件
backgroundTint="@" 按钮图片背景颜色选择器<br>
foreground="@" 设置前景色,会把一切背景覆盖
EditText 输入框<br>
textColorHint="" 设置默认文本颜色<br>
drawableTop/Bottom/Left/Right="" 上/下/左/右侧插入图片<br>
drawableStart/End="" 左/右侧插入图片(SDK>=API 17最好使用)<br>
drawablePadding="" 设置图片和内容的间隔<br>
lines="" 最大显示行数<br>
ImageView 图片<br>
scaleType="" 图片显示样式<br>
maxHeight="" 最大高度<br>
maxWidth="" 最大宽度<br>
adjustViewBounds="true" 是否可以改变图片大小<br>
app:tint="" 前景色<br>
ProgressBar 进度条<br>
visibility="gone" 不可见<br>
visibility="visible" 可见<br>
max="" 进度条最大值<br>
progress="" 进度条默认进度<br>
style=""
?android:attr/progressBarStyleHorizontal 进度条样式[水平进度条]
?android:attr/progressBarStyleSmall 小圆圈<br>
?android:attr/progressBarStyleStyleLarge 大圆圈<br>
@android:style/Widget.ProgressBar.Horizontal 粗进度条<br>
@android:style/Widget.ProgressBar.Small 粗小圆圈<br>
@android:style/Widget.ProgressBar.Large 粗大圆圈<br>
indeterminate="true" 不显示精确进度<br>
Toolbar 自定义标题<br>
titleTextColor="" 设置标题文字颜色<br>
subtitleTextColor="" 设置子标题文字颜色<br>
title="" 设置标题内容<br>
subtitle="" 设置子标题内容<br>
logo="" 设置logo<br>
navigationIcon="" 设置按钮图片<br>
titleMarginStart="" 间隔左边多远<br>
RelativeLayout 相对布局<br>
divider="" 分割线<br>
showdivider="" 显示分割线<br>
dividerpadding="" 分割线内边距<br>
layout_weight="" 权重<br>
只有一个设置,占据剩下的全部空间
多个按照n:n的比例来分配
相对父级对齐<br>
layout_centerVertical="true" 垂直居中<br>
layout_centerInParent="" C位<br>
layout_centerHorizontal="true" 水平居中<br>
layout_alignParentTop/Bottom/Left/Right="true" 上下左右对齐<br>
layout_marginTop/Bottom/Left/Right="偏移大小" 上/下/左/右偏移<br>
layout_margin="偏移量" 上下左右同时偏移<br>
相对同级对齐
layout_toLeftOf/Right="同级id" 靠左/右<br>
layout_below="同级id" 靠底部<br>
layout_above="同级id" 靠顶部<br>
layout_alignTop/Bottom/Left/Right="同级id" 上/下/左/右对齐<br>
相对子极对齐
padding="偏移量" 同时偏移上下左右<br>
paddingTop/Bottom/Left/Right="偏移量" 上/下/左/右偏移<br>
FrameLayout 帧布局<br>
foreground="" 设置前景<br>
foregroundGravity="" 设置前景位置<br>
TableLayout 表格布局每个元素独占一行<br>
TableRow标签 让控件在一行<br>
collapseColumns="" 需要隐藏的列序号<br>
stretchColumns="" 需要拉伸列序号<br>
android:shrinkColumns="" 需要收缩的列序号<br>
layout_column="" 控件在第几列显示<br>
layout_span= "" 该列横跨多少列
GridLayout 网格表格布局<br>
row/columnCount="" 最大行/列数<br>
layout_row/column="" 位于第几行/列<br>
layout_row/columnWeight="" 行/列权重<br>
layout_row/columnSpan="" 跨几行/列<br>
需要配合 layout_gravity="fill"<br>
ConstraintLayout 约束布局<br>
直接点击控件拖动即可
ListView 列表视图<br>
entries="list资源"
list资源 在value文件夹中创建
<resources><br> <string-array name="资源名"><br> <item>标题</item><br> </string-array><br></resources>
ImageButton 图片按钮<br>
RadioButton 单选按钮<br>
checked="true" 默认选中<br>
RadioGroup 分组标签<br>
CheckBox 复选按钮<br>
DatePicker 日期选择器<br>
TimePicker 时间选择器<br>
Chronometer 计时器<br>
format="%s" 时间显示格式<br>
SeekBar 拖动条<br>
thumb="" 设置拖动点图片<br>
RatingBar 星星选择器<br>
numStart="" 星星的数量<br>
rating="" 点亮的星星个数<br>
stepSize="" 点亮的大小<br>
isIndicator="true" 星星数量是否能改变<br>
GridView
android:numColumns="4" 一行显示几列<br>
Spinner 下拉列表<br>
entries 设置列表内容<br>
HorizontalScrollView 水平滚动窗口<br>
ScrollView 垂直滚动窗口<br>
TabHost 选项卡<br>
TabWidget 选项卡部件<br>
android:id="@android:id/tabs" 标签id<br>
android:id="@android:id/tabcontent" 内容id<br>
打开方式<br>
<action android:name="android.intent.action.VIEW"/> 视图<br>
<category android:name="android.intent.category.DEFAULT"/> 默认打开<br>
include 导入其他布局
layout="布局文件位置"<br>
布局标签
<style name="布局名" parent="继承于"><br> <item name="类型"></item><br></style><br>
样式布局
<style name="样式名" parent="继承于"><br> <item name="类型"></item><br></style>
使用样式 style="@style/样式名"<br>
菜单资源文件<br>
在menu目录下创建
<item id="id" title="标题"></item><br>
Java控制
getLayoutInflater().inflate(R.layout.test_view, null); 获得视图对象<br>
TextView继承这个方法的类
重写isFocused()返回true则获取焦点
Toolbar事件<br>
toolbar.setNavigationOnClickListener(new View.OnClickListener()); 点击事件<br>
toolbar.setOnTouchListener(new View.OnTouchListener()); 移动事件<br>
PopupWindow 窗口<br>
new PopupWindow(view1, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); <br>创建PopupWindow对象
true 可关闭
false 不可关闭
popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.qhsn)); 设置窗口图片<br>
popupWindow.showAsDropDown(view); 显示窗口<br>
popupWindow.dismiss(); 关闭窗口<br>
ListView 列表视图<br>
setOnItemClickListener(new AdapterView.OnItemClickListener()) 单击事件<br>
setOnItemLongListener(new AdapterView.OnItemClickListener()) 长按事件<br>
Toast.makeText(this, "单击", Toast.LENGTH_LONG); 弹出提示文字<br>
单选按钮
getChildAt(index); 获取单选按钮组中的单选按钮<br>
isChecked(void); 判断单选按钮是否被选中<br>
setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()); 选中事件
日期选择器<br>
datePicker.init(year, month, day, OnDateChangedListener); 初始化<br>
new OnDateChangedListener(); 选中事件<br>
时间选择器<br>
tp.setIs24HourView(true); 是否设置为24小时制<br>
计时器<br>
chronometer.setBase() 设置时间的起始位置<br>
SystemClock.elapsedRealtime() 返回自启动软件以来的毫秒数<br>
chronometer.start(); 开始计时<br>
chronometer.stop(); 停止计时<br>
chronometer.setOnChronometerTickListener() 计时器监听<br>
getBase() 获取基准后的时间<br>
进度条
Message消息对象
message.what = 0x111; 设置消息变量<br>
handler.sendMessage(message); 加入消息处理<br>
Handler handler = new Handler(){} 消息处理对象<br>
handleMessage(msg) 重写这个方法[开始处理消息]<br>
拖动条<br>
seekBar.setOnSeekBarChangeListener(); 设置监听事件<br>
ImageSwitcher
imageSwitcher.setFactory() 生成视图工厂<br>
imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.fade_out)); 弹出动画<br>
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.fade_in)); 进入动画<br>
imageSwitcher.setImageResource() 设置新图片<br>
event.getAction() 获取触摸类型<br>
设置下拉列表
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 设置下拉列表视图资源<br>
getItemAtPosition(position)/getSelectedItem() 获取下拉列表选中项
setOnItemSelectedListener() 选择监听器<br>
适配器
SimpleAdapter(上下文对象, list, 资源地址,Key, Value); 简单适配器<br>
BaseAdapter继承此类实现|直接new 基本适配器<br>
ArrayAdapter 数组适配器<br>
setAdapter() 设置适配器<br>
选项卡
LayoutInflater inflater = LayoutInflater.from(this); 获取对象<br>
tabHost.setup(); 设置TabHost<br>
inflater.inflate(R.layout.t1, tabHost.getTabContentView()); 展开新的视图<br>
tabHost.addTab(tabHost.newTabSpec("t1").setIndicator("精选图片").setContent(R.id.t1)); 添加选项卡<br>
Activity之间跳转
setContentView(R.layout.test); 设置关联布局<br>
startActivityForResult(intent, requestCode); 开始跳转,携带请求值,可返回值<br>
setResult(123, intent); 返回结果给请求的Activity<br>
返回的结果在onActivityResult重写方法中<br>
Bundle
bundle.get("key") 获得与key对应的value<br>
bundle.put("key", value); 将数据以键值对的方式存储<br>
Intent
new Intent(MainActivity.this,TestActivity.class); 指定从A跳转到B<br>
this.getIntent() 获得传递过来的Intent对象<br>
intent.getExtras() 获得Intent对象中的Bundle对象<br>
intent.putExtras(bundle); 将Bundle对象放入Intent对象<br>
intent.setComponent(componentName); 设置Component<br>
intent.setAction(Intent常量); 跳转到XX界面<br>
ACTION_SENDTO 跳转到信息界面
ACTION_DIAL 跳转到拨号界面<br>
ACTION_MAIN 设置为主页面<br>
ACTION_VIEW 显示视图<br>
intent.setData(Uri.parse("目标")); 设置XX目标<br>
smsto:目标邮箱 设置发送目标<br>
tel:目标号码 拨打目标<br>
http://目标网站 访问网站<br>
intent.putExtra("sms_body", "内容"); 设置发送消息内容<br>
intent.addCategory(Intent常量); 添加类别<br>
CATEGORY_HOME 返回主界面<br>
intent.setFlags(Intent常量); 设置标志<br>
FLAG_ACTIVITY_NO_HISTORY 离开界面销毁栈数据<br>
ComponentName<br>
new ComponentName("当前包名", 目标完整类名); 从当前类跳转到目标类<br>
物理按键常量
音量键
KEYCODE_VOLUME_UP 声音增大<br>
KEYCODE_VOLUME_DWON 声音减小<br>
电源键<br>
KEYCODE_POWER
返回键
KEYCODE_BACK
主页键
KEYCODE_HOME
菜单键
KEYCODE_MENU
Service
startService(new Intent(MainActivity.this, MyService.class)); 启动service<br>
stopService(new Intent(MainActivity.this, MyService.class)); 停止service<br>
生命周期
onCreate 创建<br>
onStartCommand/onBind 启动/绑定<br>
onUnbind 解绑<br>
onDestroy 销毁<br>
外部框架
Glide 图片处理<br>
new DrawableCrossFadeFactory.Builder(毫秒).setCrossFadeEnabled(true).build(); 动画结束,删除占位图<br>
Grlide.with(this) 图片设置
.asBitmap() 设置为位图,默认Drawable<br>
.load(url) 图片地址<br>
.transition(BitmapTransitionOptions.withCrossFade(3000/factory)) 淡入时间
.transform() 图片样式
new CircleCrop() 圆形图片<br>
new RoundedCorners(50) 圆角图片<br>
new GranularRoundedCorners(300, 400, 500, 600) 自定义形状<br>
new Rotate(90) 旋转角度<br>
.apply(option) 使用配置对象
.into(imageView); 加载到该控件
new RequestOptions(). 请求配置
placeholder(R.drawable.place) 请求时
error(R.drawable.error) 请求错误时
fallback(R.drawable.fallback) 请求参数未null时
override(1000, 1000); 图片大小
Glide外部依赖<br>
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
OKHttp<br>
配置
依赖
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
因特网权限
<uses-permission android:name="android.permission.INTERNET"/>
需要在网络环境下才能正常运行<br>
请求
Get同步<br>
1)new Thread(()->{}).start(); 需要再子线程中操作<br>
2) request = new Request 请求设置<br>
2.1) .Builder() 建立请求对象<br>
2.2).url("https://www.httpbin.org/get?name=zs&age=18") 设置要访问的地址/访问方式/参数<br>
2.3).build(); 生成请求对象<br>
3)call =okHttpClient.newCall(request); 获取Call对象<br>
4)response = call.execute(); 获取响应对象<br>
Get异步
1)请求设置 和同步一致<br>
2) 获取Call对象 和同步一致<br>
3)call.enqueue(() -> Unit); 产生异步<br>
onFailure 通信失败<br>
onResponse 通信成功<br>
Post同步
1)需要在子线程中操作 和Get同步一样<br>
2)formBody = new FormBody 表单设置<br>
2.1).Builder() 建立表单<br>
2.2).add(name, value) 添加元素<br>
2.3).build(); 生成请求对象<br>
3)request = new Request 请求设置<br>
3.1).Builder() 建立请求对象<br>
3.2).url("https://www.httpbin.org/post") post请求地址<br>
3.3).post(formBody) 将请求改为post请求<br>
3.4).build(); 生成请求对象<br>
4)剩下和Get同步一样<br>
Post异步
1)表单设置 请求设置 和POST同步一样<br>
3)获取Call对象 产生异步 和Get同步一样<br>
4) 和Get异步一样<br>
Post提交文件
1)File file1 = new File("D:\\Desktop\\依赖.txt"); 选择要提交的文件<br>
2)RequestBody file1Option = RequestBody.create(file1, MediaType.parse("text/plain")); 设置提交类型<br>
3)MultipartBody body = new MultipartBody
3.1).Builder() 建立多部分体<br>
3.2).addFormDataPart("file1", file1.getName(), file1Option) 添加文件
3.3).build(); 生成多部分体对象<br>
4)剩下的和Post异步或同步一样
拦截器<br>
new OkHttpClient.Builder().addInterceptor(chain->{}); 前置拦截器
.addNetworkInterceptor(chain -> {}); 后置拦截器<br>
Request request = chain.request().newBuilder() 请求设置
.addHeader("os", "Android") 添加请求头元素<br>
.build() 生成请求设置
Response response = chain.proceed(request); 进行拦截<br>
Cookie
new OkHttpClient.Builder().cookieJar(new CookieJar(){}); 获取Cookie<br>
saveFromResponse 服务器响应的Cookie<br>
loadForRequest 向服务器发起请求的Cookie<br>
Retrofit okHttp的封装版<br>
注解
方法注解 决定方法的请求方式<br>
@GET<br>
@POST<br>
@PUT
@DELETE
@PATH
@HEAD
@OPTIONS
@HTTP(method="GET" path="get") 自定义方式<br>
标记注解<br>
@FormUrlEncoded 以Form表单的方式提交POST请求的参数<br>
@Multipart 上传文件时对方法的注解
@Streaming 以流的方式获取文件<br>
参数注解
@Query 针对GET请求<br>
@QueryMap 针对GET请求,可将参数定义为Map对象<br>
@Field 针对POST请求
@FieldMap 针对POST请求,可将参数定义为Map对象
@Part 上传单个文件对参数的注解<br>
@PartMap 允许文件上传为一个Map对象<br>
@Body 可将参数指定为Body对象<br>
其他注解
@Path 传递的值能修改方法注解中的值,如:<br><br>@POST("{id}")<br>Call<ResponseBody> post(@Path("id") String path); <br>
@Header 设置请求头<br>
@Headers 写死多个请求头<br>
@Url 指定一个完整的Http请求地址<br>
接口定义
@GET<br>Call<RequestBody> get(@Query("user") String , @Query("pwd") String); <br>
@POST<br>@FormUrlEncoded<br>Call<RequestBody> post(@Field("user") String, @Field("pwd") String);
方法<br>
retrofit.create(RetrofitService.class); 创建某个类<br>
.baseUrl("https://www.httpbin.org/") 要访问的网址<br>
.callFactory(new OkHttpClient()) 自定义一个OkHttp规则<br>
Gson
序列化
@SerializedName("name") 序列化变量名采用该名<br>Json的key与Java的关键冲突时使用<br>
new Gson().toJson(class); 将Java对象序列化为Json对象<br>
@Expose(serialize = false) 不参与序列化<br>
反序列化
new Gson().fromJson(Json, 对应的Java对象/type); 将Json反序列化为Java对象<br>
new TypeToken<List<User>>(){}.getType(); 识别集合中存储的对象<br>
@Expose(deserialize = false) 不参与反序列化<br>
序列化与反序列化<br>
Java修饰符transient 不参加序列化与反序列化<br>@Expose(deserialize = false, serialize = false)<br>
new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() 使@Expose注解生效<br>
数据存储
SP
getSharedPreferences("name", Context.MODE_APPEND); 追加<br>
getSharedPreferences("name", Context.MODE_PRIVATE); 默认<br>
修改资源布局 setTheme(R.Style.样式名) 必须在初始化布局之前调用<br>
菜单
选项菜单<br>
在xml中创建菜单资源文件
重写onCreateOptionsMenu方法 指定资源文件MenuInflater(this).inflate(R.menu.menu, menu)<br>
重写onOptionsItemSelected方法 在这里进行选中动作
上下文菜单
在xml中创建菜单资源文件
为控件注册上下文菜单 registerForContextMenu(findViewById())
重写onCreateContextMenu方法 指定资源文件MenuInflater(this).inflate(R.menu.menu, menu)<br>
重写onContextItemSelected方法 在这里进行选中动作
ActionBar
添加和隐藏ActionBar
通过Java实现
getSupportActionBar().hide() 隐藏<br>
getSupportActionBar().show() 显示
设置theme属性, 可以隐藏或显示ActionBar
getSupportActionBar.setDisplayShowTitleEnabled(false) 隐藏ActionBar的标题
ActionItem
在xml创建菜单资源文件的基础上加一个app:showAsAction属性<br>
always 始终显示在ActionBar上<br>
ifRoom 空间足够显示在ActionBar上
never 永远不显示在ActionBar上<br>
withText 显示在ActionBar上,并显示文本
当app:showAsAction不管用时 在onCreateOptionsMenu之上额外加上 <br>MenuItemCompat.setShowAsAction(menu?.findItem(需要展示的item的id),MenuItemCompat.SHOW_AS_ACTION_ALWAYS)<br>
重写onCreateOptionsMenu方法 <br>指定资源文件MenuInflater(this).inflate(R.menu.menu, menu)
重写onOptionsItemSelected方法 在这里进行选中动作
Alertdialog 弹窗
new AlertDialog.Builder(this).create() 创建弹窗对象<br>
.setButton(按钮类型, "按钮文字", (dialog, which) -> Unit) 设置按钮<br>
Dialog.BUTTON_NEUTRAL 左边按钮
Dialog.BUTTON_NEGATIVE 中间按钮
Dialog.BUTTON_POSITIVE 右边按钮
new AlertDialog.Builder(this) 链式调用
.setNeutralButton("按钮文字", (dialog, which) -> Unit) 左边按钮
.setNegativeButton(...) 中间按钮
.setPositiveButton(...) 右边按钮
.setItems(资源数组, (dialog, which) -> Unit) 设置列表弹窗<br>
.setSingleChoiceItems(资源数组, 默认选中, (dialog, which) -> Unit) 设置单选列表弹窗
.setMultiChoiceItems(资源数组, 布尔数组, (dialog, which, isChecked) -> Unit) 设置多选列表弹窗
.setIcon(图片地址) 弹窗图片<br>
.setMessage("") 弹窗内容<br>
.setView(inflate) 自定义布局<br>
inflate = getLayoutInflater().inflate(R.layout.test_view, null); 布局的链接<br>
.create() 构建
.show() 展示
发起通知<br>
manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE) 获得系统服务
notification = new Notification.Builder(this) 创建通知对象 链式调用<br>
.setSmallIcon(图片资源) 设置通知的小图标,必选
.setContentTitle("标题") 设置标题
.setContentText("内容") 设置内容
.setDefaults(Notification.DEFAULT_SOUND) 设置默认动作,如默认通知声音
.setContentIntent(pendingIntent) 点击消息跳转
intent = Intent(A.this, B.class) 从A跳跃到B
pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0) 点击消息后获得目标Activity
.setWhen(long) 设置发送时间
.setAutoCancel(true) 点击通知,自动消失
.build() 链式调用结束最后调用这个方法, 构建Notification
manager.notify(标识id, notification) 发送消息<br>
广播
静态广播<br>
Main
sendBroadcast(Intent().setAction("Hello")) 发送广播
Br extends BroadcastReceiver<br>
重写onReceive方法 该方法会收到广播
AndroidManifest.XML
receiver<br>
android:name="。Br" 要注册的类
exported="true" 是否能接收其他软件的广播
enabled="true" 是否能被实例化<br>
intent-filter
action<br>
name="Hello" 要绑定的广播
动态广播<br>
<font color="#ffffff">1.创建并继承,和重写</font><br><font color="#ffffff">public class CustomReceiverStatic extends BroadcastReceiver {<br> public void onReceive(Context context, Intent intent) {}<br>}</font>
<font color="#ffffff">2.CustomReceiver receiver = new CustomReceiver(); 创建需要接收广播的类实例</font>
<font color="#ffffff">3.IntentFilter intentFilter = new IntentFilter(); 创建IntentFilter标签对象</font>
<font color="#ffffff">4.intentFilter.addAction(Custom.CUSTOMRECEIVER); 添加Action属性</font>
<font color="#ffffff">5.registerReceiver(receiver, intentFilter); 注册该类,以IntentFilter方式注册</font>
<font color="#ffffff">6.sendBroadcast(new Intent().setAction(name<span style="font-weight: bold; font-style: italic;"></span>)); 发送广播</font>
闹钟 TimePicker
time = findViewById() 获得TimePocker对象
.setIs24HourView(false) 设置12小时制
time.currentHour 获得当前设置的时
time.currentMinute 获得当前设置的分
intent = Intent(A.this, B.class) 规定跳转
pendingIntent = PendingIntent.getActivity(context, 0, intent, 0) 获得PendingIntent对象
service = (AlarmManager)getSystemService(Context.ALARM_SERVICE) 获得AlarmManager对象
.set(唤醒方式, calendar.timeInMillis, pendingIntent) 设置闹钟
AlarmManager.RTC_WAKEUP 到指定时间提醒,唤醒<br>
AlarmManager.RTC 到指定时间提醒,不唤醒
ELAPSED_REALTIME_WAKEUP 到指定时间延时提醒 唤醒
ELAPSED_REALTIME 到指定时间延时提醒 不唤醒
calendar = Calendar.getInstance() 获得日历对象
.set(时间类型, 时间位置)
Calendar.HOUR_OF_DAY 时类型
Calendar.MINUTE 分类型
Calendar.SECOND 秒类型
画笔和画布
new Paint()
.setStyle(样式) 修改画笔样式<br>
Paint.Style.FILL 填充<br>
Paint.Style.STROKE 描边
Paint.Style.FILL_AND_STROKE 填充和描边
.setStrokeWidth(0f) 线的宽度<br>
.setColor(ContextCompat.getColor(context, 颜色资源))<br>
.setTextSize(0f) 字体大小
.setTypeface(Typeface.常量) 画笔类型<br>
.setAntiAlias(true) 是否启动抗锯齿画笔<br>
.setPathEffect(DashPathEffect(new float{10f, 10f}, 10f)) 画笔路径效果<br>
canvas
.drawRect(↖x, ↖y, ↘x, ↘y, paint) 绘制矩形<br>
.drawLine(起始x, 起始y, 目标x, 目标y, paint) 绘制线
.drawText(文字, x, y, paint) 绘制文字<br>
.drawCircle(x, y, r, paint) 绘制圆
.drawPah(path, paint) 绘制路径
.drawTextOnPath("str", path, x偏移量, y偏移量, paint) 绕路径的文本<br>
.withTranslation(x, y){} 拖动画布到(x,y)
.withRotation(angle){} 旋转画布angle度
共用
EditText
onTextChanged 文本框变动监听器
onTouchEvent 文本框触碰监听器
方法
setCompoundDrawablesRelativeWithIntrinsicBounds(⬅, ⬆, ➡, ⬇) 向控件中添加有初始值的资源<br>
ContextCompat.getDrawable(context, 资源地址) 获取Dawable布局
e.getAction() 当前触碰方式
e.getX() 当前触碰的X轴
e.getY() 当前触碰的Y轴
getWidth() 获取当前控件宽度
getHeight() 获取当前控件高度
it.getIntrinsicWidth() 获得固有宽度
it.getIntrinsicHeight() 获得固有高度
常量
MotionEvent.ACTION_UP 弹起事件
路径new Path()<br>
.addCircle(x, y, r, 方向) 绘制圆形路径
.addRect(bx by, ex, ey 方向) 绘制矩形路径
Path<br>
Path.Direction.CCW 逆时针
Path.Direction.CW 顺时针
计算机绘图
1.不要直接用画笔在画布上画, 这和现实绘画有点不同<br>现实绘画,画布基本不动, 画笔频繁活动.<br>而计算机绘画恰恰相反, 画布频繁移动, 画笔基本不动<br><br>2.计算机绘画首先将画布的(x,y)坐标移动到笔下, 由此作为起点进行绘画,<br>如果要绘画一条旋转中的线, 不是画笔不断改变角度画线然后刷新得到,<br>而是画布以圆心飞快旋转, 画笔角度不变得到的
lifecycle-runtime-ktx-2.4.0 需要这个外部依赖
LifecycleObserver 继承这个类
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME) 注解标记一个启动方法
rotatingJob = CoroutineScope(Dispatchers.Main).launch {<br> while (true){<br> delay(1)<br> mAngle += 0.08f<br> invalidate()<br> }<br> }
lifecycle.addObserver(findViewById<MyView>(R.id.myView)) 主函数中调用
动画
逐帧动画
1.配置xml
1.在res中创建anim文件夹<br>
2.在xml中设置<br><animation-list><br>
3.在<animation-list>标签中设置<br><item drawable="资源路径" duration="停留毫秒"><br>
4.将配置的xml使用到布局的背景上
2.启动动画
1.animationDrawable = 控件.getBackground() 获取动画<br>
2.animationDrawable.start() 启动动画
3.animationDrawable.stop() 停止
补间动画
1.渐变动画
1.配置xml
1.在res中创建anim文件夹<br>
2.在xml中设置<set>标签<br>
3.在<set>标签中设置<br><alpha forAlpha="0~1" toAlpha="0~1" duration="动画持续毫秒"><br>
4.将配置的xml使用到布局的背景上
2.为控件绑定补间动画
1.animation = AnimationUtils.loadAnimation(上下文, 补间动画资源)<br>
2.控件.startAnimation(animation) 启动补间动画
2.旋转动画
1.配置xml
1.在res中创建anim文件夹<br>
2.在xml中设置<set>标签<br>
3.在<set>标签中设置<br><rotate forDegress="0~360" toDegress="0~360" pivotX="中心X点" pivotY="中心Y点" duration="动画持续毫秒"><br>
4.将配置的xml使用到布局的背景上
2.为控件绑定补间动画
1.animation = AnimationUtils.loadAnimation(上下文, 补间动画资源)<br>
2.控件.startAnimation(animation) 启动补间动画
3.缩放动画
1.配置xml
1.在res中创建anim文件夹<br>
2.在xml中设置<set>标签<br>
3.在<set>标签中设置<br><scale forXScale="缩放前X" forYScale="缩放前Y" toXScale="缩放比例X" toYScale="缩放比例Y" pivotX="中心X点" pivotY="中心Y点" duration="动画持续毫秒"><br>
3.在<set>标签中设置<br><scale forXScale="缩放前X" forYScale="缩放前Y" toXScale="缩放比例X" toYScale="缩放比例Y" pivotX="中心X点" pivotY="中心Y点" duration="动画持续毫秒"><br>
4.将配置的xml使用到布局的背景上
2.为控件绑定补间动画
1.animation = AnimationUtils.loadAnimation(上下文, 补间动画资源)<br>
2.控件.startAnimation(animation) 启动补间动画
4.平移动画
1.配置xml
1.在res中创建anim文件夹<br>
2.在xml中设置<set>标签<br>
3.在<set>标签中设置<br><translate fromXDelta="起始x" fromYDelta="起始y" toXDelta="结束x" toYDelta="结束y" duration="动画持续毫秒"><br>
4.将配置的xml使用到布局的背景上
2.为控件绑定补间动画
1.animation = AnimationUtils.loadAnimation(上下文, 补间动画资源)
2.控件.startAnimation(animation) 启动补间动画
多媒体
播放音频的两种方法
1.MediaPlay
1.MediaPlay静态方法
.create(context, 音频资源) 通过create方法指定需要播放的音乐
2.MediaPlay非静态方法
.start() 开始播放
.stop() 停止播放
.pause() 暂停播放
.reset() 重置
.setOnCompletionListener(() -> {}) 完成事件监听器
.setDataSource() 通过setDataSource方法指定需要播放的音乐
.isPlaying() 音乐是否处于播放状态
.release() 释放资源
2.SoundPool
Drawable控制
item标签
drawable="@" 引用位图/颜色<br>
state_pressed="true" 控件是否被按下<br>
state_focused="true" 控件是否获得焦点<br>
state_enable="true" 控件是否可用<br>
state_selected="true" 控件是否被选中,针对滚轮<br>
state_checked="true" 控件是否被勾选<br>
state_checkable="true" 控件可否被勾选<br>
异常处理
Unknown Service Exception 未知服务异常<br>
解决方案 android:usesCleartextTraffic="true"
android:screenOrientation="landscape" 设置横屏显示<br>
0 条评论
下一页