title: android基础
data: 2022年4月27日19:59:20
tags: 计算机
演示项目地址
https://gitee.com/lixiang856/android_base
1.Android项目结构
Project和Module的基本概念
2.项目打包
3.AVD
AVD:android虚拟设备的简称。
AVD和模拟器之间的关系:模拟器不包含操作界面,需要借助AVD呈现
创建AVD
选择模拟器型号
选择android版本
4.常用控件
TextView(文本框)
- id://全局唯一Id
- findViewById(R.Id.***)//获取控件
- layout_width://组件宽度
- layout_height://组件高度
- text://展示的文本内容
- textColor://字体颜色
- #00000000//纯透明
- #FF000000//不透明
- #FFFF0000//红色
- #FF00FF00//绿色
- #FF0000FF//蓝色
- textstyle://设置字体风格
- textSize://字体大小,单位一般为sp
- background://控件的背景颜色,可为图片
- gravity://控件内容的对齐方向
- center|left
阴影效果
- shadowColor://设置阴影颜色,需搭配shadowRadius一起使用
- shadowRadius://设置阴影模糊程度,0.1为字体模糊程度,建议3.0
- shadowDx://设置阴影在水平方向的偏移
- shadowDy://设置阴影在垂直方向的偏移
跑马灯
- singleLine://内容单行显示
- focusable://是否可以获取焦点
- focusableInTouchMode://在控制视图的触摸模式下是否可以聚焦
- ellipsize://在哪里省略文本
- marqueeRepeatLimit://字幕动画重复的次数
- 标签//获取焦点
Button(按钮)
-
background:@drawable/btn_selector//按钮的背景点击效果
-
<item android:drawable="@drawable/ic_alarm_black_24dp" android:state_pressed="true"/> <item android:drawable="@drawable/ic_alarm_off_black_24dp" />
-
-
backgroundTint://按钮的颜色背景点击效果,效果可以与background叠加
-
foreground://前景
-
enabled
事件
-
onClick//点击事件
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = findViewById(R.id.btn); //点击事件 btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.e(TAG,"--------------------onClick"); } }); //长按事件 btn.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { Log.e(TAG,"------------------onLongClick"); return false; } }); //触摸事件 btn.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { //motionEvent.getAction() 0,按下;1,弹起;2,移动 Log.e(TAG,"------------------onTouch+"+motionEvent.getAction()); //true为消费事件,触摸事件结束后不会继续调用事件; //false则继续调用 return false; } }); } public void onclick(View view) { Log.e(TAG,"======================onclick"); }
EditText(输入框)
- hint输入提示
- textColorHint提示文字颜色
- inputType输入类型
- singleLine单行展示
- drawableXxxx在输入框的指定方位添加图片
- paddingXxxx设置内边距
- background背景色
ImageView(图片框)
- src 资源路径
- scaleType 设置图片缩放类型
- fitStart 保持宽高比缩放图片,直到较场边与组件相等,位于左上角
- fitEnd 同上,位于右下角
- fitContent 同上,位于中间
- fitXY 对图像的横纵进行等比例缩放
- content 保持原图大小,超出裁剪,位于中心
- contentCrop 保持宽高比例缩放图片,直到完全覆盖组件,超出部分裁剪
- contentInside 保持宽高比例缩放图片,直到组件能够完全展示,缺少部分留白
- matrix 不改变原图大小,从左上角开始绘制,超出部分裁剪
- maxWidht 最大宽度
- maxHeight 最大高度
- adjustViewBounds 调整View的界限
RadioButton(单选按钮)
<RadioGroup
android:id="@+id/rg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/btnMan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="男" />
<RadioButton
android:id="@+id/btnWoman"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女" />
</RadioGroup>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/rg" />
private TextView man;
private Button button;
private RadioGroup radioGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
man = findViewById(R.id.btnMan);
button = findViewById(R.id.btn);
radioGroup = findViewById(R.id.rg);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton radioButton = findViewById(checkedId);
Toast.makeText(MainActivity.this,radioButton.getText(), Toast.LENGTH_SHORT).show();
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (int i = 0; i < radioGroup.getChildCount(); i++) {
RadioButton radioButton = (RadioButton)radioGroup.getChildAt(i);
if (radioButton.isChecked()) {
Toast.makeText(MainActivity.this, "本次提交的是"+radioButton.getText(), Toast.LENGTH_SHORT).show();
}
}
}
});
}
Checkbox(复选框)
private CheckBox man;
private CheckBox woman;
private CheckBox womanAndMan;
private Button button;
private List<String> data = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
man = findViewById(R.id.btnMan);
woman = findViewById(R.id.btnWoman);
womanAndMan = findViewById(R.id.btnWomanAndMan);
button = findViewById(R.id.btn);
man.setOnCheckedChangeListener(this);
woman.setOnCheckedChangeListener(this);
womanAndMan.setOnCheckedChangeListener(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<String> data = new ArrayList<>();
if (man.isChecked())data.add(man.getText().toString());
if (woman.isChecked())data.add(woman.getText().toString());
if (womanAndMan.isChecked())data.add(womanAndMan.getText().toString());
Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (compoundButton.isChecked()) Toast.makeText(this, compoundButton.getText(), Toast.LENGTH_SHORT).show();
}
ToggleButton(开关按钮)
private ToggleButton toggleButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toggleButton = findViewById(R.id.toggleBtn);
toggleButton.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
Toast.makeText(this,toggleButton.isChecked()?"打开":"关闭" , Toast.LENGTH_SHORT).show();
}
Switch(开关)
private Switch aSwitch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
aSwitch = findViewById(R.id.aSwitch);
aSwitch.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
Toast.makeText(this, compoundButton.isChecked()?"开":"关", Toast.LENGTH_SHORT).show();
}
- **android:showText:**设置on/off的时候是否显示文字,boolean
- **android:splitTrack:**是否设置一个间隙,让滑块与底部图片分隔,boolean
- **android:switchMinWidth:**设置开关的最小宽度
- **android:switchPadding:**设置滑块内文字的间隔
- **android:switchTextAppearance:**设置开关的文字外观,暂时没发现有什么用…
- **android:textOff:**按钮没有被选中时显示的文字
- **android:textOn:**按钮被选中时显示的文字
- **android:textStyle:**文字风格,粗体,斜体写划线那些
- **android:track:**底部的图片
- **android:thumb:**滑块的图片
- android:typeface:设置字体,默认支持这三种:sans, serif, monospace;除此以外还可以使用 其他字体文件(.ttf*),首先要将字体文件保存在assets/fonts/目录下,不过需要在Java代码中设置: Typeface typeFace =Typeface.createFromAsset(getAssets(),“fonts/HandmadeTypewriter.ttf”); textView.setTypeface(typeFace);
SeekBar(拖动条)
private SeekBar seekBar;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar = findViewById(R.id.seekBar);
textView = findViewById(R.id.tv);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
textView.setText("当前进度值:"+i+"/100");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
Toast.makeText(MainActivity.this, "触碰进度条", Toast.LENGTH_SHORT).show();
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Toast.makeText(MainActivity.this, "松开进度条", Toast.LENGTH_SHORT).show();
}
});
}
ScrollView(滚动条)
private Button top_btn;
private Button bottom_btn;
private ScrollView scrollView;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.tv);
scrollView = findViewById(R.id.scrollView);
top_btn = findViewById(R.id.top_btn);
bottom_btn = findViewById(R.id.bottom_btn);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 100; i++) {
sb.append(i+"\r\n");
}
textView.setText(sb.toString());
top_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
scrollView.fullScroll(ScrollView.FOCUS_UP);
}
});
bottom_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
});
}
其他几种常用对话框基本使用
private Button btn1;
private Button btn2;
private Button btn3;
private ProgressDialog pd1 = null;
private ProgressDialog pd2 = null;
private final static int MAXVALUE = 100;
private int progressStart = 0;
private int add = 0;
private Context mContext = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = MainActivity.this;
bindViews();
}
private void bindViews() {
btn1 = findViewById(R.id.btn1);
btn2 = findViewById(R.id.btn2);
btn3 = findViewById(R.id.btn3);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn1:
//这里的话参数依次为,上下文,标题,内容,是否显示进度,是否可以用取消按钮关闭
ProgressDialog.show(MainActivity.this, "资源加载中", "资源加载中,请稍后...",false,true);
break;
case R.id.btn2:
pd1 = new ProgressDialog(mContext);
pd1.setTitle("软件更新中");
pd1.setMessage("软件正在更新中,请稍后。。。");
pd1.setCancelable(true);
pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd1.setIndeterminate(true);
pd1.show();
break;
case R.id.btn3:
//初始化属性
progressStart = 0;
add = 0;
pd2 = new ProgressDialog(mContext);
pd2.setMax(MAXVALUE);
pd2.setTitle("软件更新中");
pd2.setMessage("软件正在更新中,请稍后。。。");
pd2.setCancelable(true);
pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd2.setIndeterminate(false);
pd2.show();
new Thread(){
@Override
public void run() {
while (progressStart<MAXVALUE){
progressStart=2*usetime();
hand.sendEmptyMessage(123);
}
}
}.start();
}
}
private int usetime(){
add++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return add;
}
//定义一个用于更新进度的Handler,因为只能由主线程更新界面,所以要用Handler传递信息
final Handler hand = new Handler(){
@Override
public void handleMessage(Message msg) {
//这里的话如果接受到信息码是123
if(msg.what == 123){
//设置进度条的当前值
pd2.setProgress(progressStart);
}
//如果当前大于或等于进度条的最大值,调用dismiss()方法关闭对话框
if(progressStart >= MAXVALUE){
pd2.dismiss();
}
}
};
private Button date;
private Button time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
date = findViewById(R.id.date);
time = findViewById(R.id.time);
date.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar calendar = Calendar.getInstance();
new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
Toast.makeText(MainActivity.this, "本次选择的时间是"+i+"年"+(i1+1)+"月"+i2+"日", Toast.LENGTH_SHORT).show();
}
},calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)).show();
}
});
time.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar calendar = Calendar.getInstance();
new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int i, int i1) {
Toast.makeText(MainActivity.this, "本次选择的时间是"+i+"时"+i1+"分", Toast.LENGTH_SHORT).show();
}
},calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true).show();
}
});
}
Menu(菜单)
private TextView textView;
private TextView textView2;
final private int RED = 110;
final private int YELLOW = 111;
final private int BLUE = 112;
final private int GREEN = 113;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.tv);
textView2 = findViewById(R.id.tv2);
registerForContextMenu(textView2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(1,RED,1,"红");
menu.add(1,YELLOW,2,"黄");
menu.add(1,BLUE,3,"蓝");
menu.add(1,GREEN,4,"绿");
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
switch (itemId){
case RED:
textView.setTextColor(Color.RED);
break;
case YELLOW:
textView.setTextColor(Color.YELLOW);
break;
case BLUE:
textView.setTextColor(Color.BLUE);
break;
case GREEN:
textView.setTextColor(Color.GREEN);
}
return super.onOptionsItemSelected(item);
}
//上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_sub,menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.blue:
textView2.setTextColor(Color.BLUE);
break;
case R.id.red:
textView2.setTextColor(Color.RED);
break;
case R.id.yellow:
textView2.setTextColor(Color.YELLOW);
}
return true;
}
ViewPager(视图滑动切换工具)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<View> list = new ArrayList<>();
LayoutInflater inflate = getLayoutInflater();
list.add(inflate.inflate(R.layout.view_one, null, false));
list.add(inflate.inflate(R.layout.view_two, null, false));
list.add(inflate.inflate(R.layout.view_three, null, false));
MyPageAdapter myPageAdapter = new MyPageAdapter(list,Arrays.asList("页面一", "页面二", "页面三"));
ViewPager viewPager = findViewById(R.id.vp);
viewPager.setAdapter(myPageAdapter);
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="35dp"
android:gravity="center"
android:text="PagerTabStrip效果演示" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/vpager_three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<androidx.viewpager.widget.PagerTabStrip
android:id="@+id/pagertitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top" />
</androidx.viewpager.widget.ViewPager>
</LinearLayout>
private ViewPager vpager_three;
private ArrayList<View> aList;
private MyPageAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_three);
vpager_three = findViewById(R.id.vpager_three);
aList = new ArrayList<>();
LayoutInflater li = getLayoutInflater();
aList.add(li.inflate(R.layout.view_one, null, false));
aList.add(li.inflate(R.layout.view_two, null, false));
aList.add(li.inflate(R.layout.view_three, null, false));
mAdapter = new MyPageAdapter(aList, Arrays.asList("第一一页", "第二二页", "第三三页"));
vpager_three.setAdapter(mAdapter);
}
ProgressBar(进度条)
<ProgressBar
android:id="@+id/progressBar"
style="@android:style/Widget.ProgressBar.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progressBar3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/progressBar" />
<ProgressBar
android:id="@+id/progressBar2"
style="@android:style/Widget.ProgressBar.Large"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/progressBar3" />
<ProgressBar
android:id="@+id/progressBar4"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="50"
app:layout_constraintTop_toBottomOf="@+id/progressBar2"
tools:layout_editor_absoluteX="-16dp" />
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/progressBar4" />
notification(通知)
private NotificationManager manager;
private Notification notification;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建通知管理器
manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) {
//创建信道
NotificationChannel channel = new NotificationChannel("llx", "text",NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel);
}
//创建转跳意图
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
//构建通知
notification = new NotificationCompat.Builder(this,"llx")
.setContentTitle("官方通知")
.setContentText("端午收快递")
.setColor(Color.parseColor("#FFFF0000"))
.setSmallIcon(R.drawable.ic_insert_emoticon_black_24dp)
.setContentIntent(pendingIntent)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.qwe))
.setAutoCancel(true)
.build();
}
public void send(View view) {
manager.notify(1,notification);
}
public void cancel(View view) {
manager.cancel(1);
}
AlertDialog(对话框)
public void click(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题")
.setIcon(R.mipmap.ic_launcher)
.setMessage("待会买凉皮收快递")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
}
})
.setNeutralButton("中间", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "中间", Toast.LENGTH_SHORT).show();
}
})
.create();
builder.show();
}
PopupWindow(悬浮框)
private PopupWindow popupWindow;
private Button btn;
private Button item_btn1;
private Button item_btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.popup_window, null, false);
//创建弹窗
popupWindow = new PopupWindow(v, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,true);
//展示弹窗
popupWindow.showAsDropDown(view,view.getWidth(),-view.getHeight());
item_btn1 = v.findViewById(R.id.item_btn1);
item_btn2 = v.findViewById(R.id.item_btn2);
item_btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Button btn =(Button) view;
Toast.makeText(MainActivity.this, "本次点击的是"+btn.getText(), Toast.LENGTH_SHORT).show();
}
});
item_btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Button btn =(Button) view;
popupWindow.dismiss();
Toast.makeText(MainActivity.this, "本次点击的是"+btn.getText(), Toast.LENGTH_SHORT).show();
}
});
}
});
}
Vibrator(振动器)
<Button
android:id="@+id/btn_hasVibrator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="判断是否有振动器" />
<Button
android:id="@+id/btn_short"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="短振动" />
<Button
android:id="@+id/btn_long"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="长振动" />
<Button
android:id="@+id/btn_rhythm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="节奏振动" />
<Button
android:id="@+id/btn_cancle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消振动" />
<uses-permission android:name="android.permission.VIBRATE"/>
private Button btn_hasVibrator;
private Button btn_short;
private Button btn_long;
private Button btn_rhythm;
private Button btn_cancle;
private Vibrator myVibrator;
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得系统的Vibrator实例:
myVibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
mContext = MainActivity.this;
bindViews();
}
private void bindViews() {
btn_hasVibrator = findViewById(R.id.btn_hasVibrator);
btn_short = findViewById(R.id.btn_short);
btn_long = findViewById(R.id.btn_long);
btn_rhythm = findViewById(R.id.btn_rhythm);
btn_cancle = findViewById(R.id.btn_cancle);
btn_hasVibrator.setOnClickListener(this);
btn_short.setOnClickListener(this);
btn_long.setOnClickListener(this);
btn_rhythm.setOnClickListener(this);
btn_cancle.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_hasVibrator:
Toast.makeText(mContext, myVibrator.hasVibrator() ? "当前设备有振动器" : "当前设备无振动器",
Toast.LENGTH_SHORT).show();
break;
case R.id.btn_short:
myVibrator.cancel();
myVibrator.vibrate(new long[]{100, 200, 100, 200}, 0);
Toast.makeText(mContext, "短振动", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_long:
myVibrator.cancel();
myVibrator.vibrate(new long[]{100, 100, 100, 1000}, 0);
Toast.makeText(mContext, "长振动", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_rhythm:
myVibrator.cancel();
myVibrator.vibrate(new long[]{500, 100, 500, 100, 500, 100}, 0);
Toast.makeText(mContext, "节奏振动", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_cancle:
myVibrator.cancel();
Toast.makeText(mContext, "取消振动", Toast.LENGTH_SHORT).show();
}
}
5.动画
- 逐帧动画:把几张图片快速的播放
- 补间动画:透明、缩放、旋转和位移效果
- 属性动画:
6.布局管理器
7.单位和尺寸
px:plxels(像素),比如1440*3040,横着1440个像素点,竖着3040个像素点。一个100X20px的按钮,在不同分辨率的设备上展示的大小是相同的,不会随着分辨率而发生变化。也可称为绝对大小。
pt:point,是一个标准的长度单位,1pt=1/72英寸,一般用于印刷业。
dip:device indepent pixels(设备独立像素),不同的设备有不同的展示效果,这个和硬件有关,一般为了支持WVGA,HVGA,QVGA推荐使用
dp:就是dip
sp:scaled pixels(放大像素),主要用于字体显示。
8.fragment
https://developer.android.com/guide/components/fragments.html
fragment的特性:
具有自己的生命周期,可以在activity中组合使用多个fragment,可以重复使用一个fragment
必须在activity才能运行,activity暂停,所有的fragment都会暂停,activity销毁,所有的fragment也都会销毁,activity运行,fragment则有自己的生命周期
fragment和activity的区别
- Fragment 相比较于 Activity 多出 4 个回调周期,在控制操作上更灵活
- Fragment 可以在 XML 文件中直接进行写入,也可以在 Activity 中动态添加
- Fragment 可以使用 show()/hide()或者 replace()随时对 Fragment 进行切换,并且切换的时候不会出现明显的效果,用户体验会好;Activity 虽然也可以进行切换,但是 Activity 之间切换会有明显的翻页或者其他的效果,在小部分内容的切换上给用户的感觉不是很好;
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:name="com.example.fragment.BlankFragment1"
android:id="@+id/fragment1"/>
<fragment
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent"
android:name="com.example.fragment.BlankFragment1"
android:id="@+id/fragment2"/>
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:id="@+id/tv"
android:text="@string/hello_blank_fragment" />
<Button
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="how are you?"
android:id="@+id/btn"/>
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (root==null){
root = inflater.inflate(R.layout.fragment_blank_fragment1, container, false);
}
textView = root.findViewById(R.id.tv);
button = root.findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
textView.setText("Yes,I am,and you?");
}
});
return root;
}
动态添加fragment
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.frameLayout,fragment);
transaction.addToBackStack(null);
transaction.commit();
}
打开界面
onAttach–>onCreate–>onCreateView–>onActivityCreated–>onStart–onResume
退出界面
onPause–>onStop
切换fragment
onPause–>onStop–>onDestroyView//ui界面替换了,所以view也销毁
重进界面
onStart–>onResume
关闭fragment
onPause–>onStop–>onDestroyView–>onDestroy–>onDetach
9.Activity
数据传递
//发送
Intent intent = new Intent(this, MainActivity2.class);
intent.putExtra("卡拉赞","快跑吧,小姑娘,快跑");
//Bundle的大小是有限制的 < 0.5MB
Bundle bundle = new Bundle();
bundle.putString("买鱼","斗鱼");
bundle.putInt("数量",20);
intent.putExtras(bundle);
startActivity(intent);
//接收
Intent intent = getIntent();
String stringExtra = intent.getStringExtra("卡拉赞");
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(stringExtra).append("\n");
TextView tv = findViewById(R.id.tv);
Bundle extras = intent.getExtras();
String fish = String.valueOf(extras.get("买鱼"));
String num = String.valueOf(extras.get("数量"));
stringBuffer.append("我今天买了").append(num).append("条").append(fish);
tv.setText(stringBuffer);
后一个传给前一个
//发起一个带响应结果的转跳
btn = findViewById(R.id.btnchoose);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,ImgActivity.class);
startActivityForResult(intent,1);
}
});
//接收回调
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1 && resultCode == 2) {
Bundle bd = data.getExtras();
int imgid = bd.getInt("imgid");
//获取布局文件中的ImageView组件
ImageView img = findViewById(R.id.imgicon);
img.setImageResource(imgid);
}
}
//发送
Intent it = getIntent();
Bundle bd = new Bundle();
bd.putInt("imgid",imgs[position]);
it.putExtras(bd);
setResult(2,it);
finish();
11.okhttp
<uses-permission android:name="android.permission.INTERNET"/>
android:usesCleartextTraffic="true"
public class MainActivity extends AppCompatActivity {
private TextView view;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = findViewById(R.id.tv);
}
/**
* 发送get同步请求
* @param view
*/
public void getSync(final View view) {
new Thread(){
@Override
public void run() {
getSyncSend("http://192.168.0.165:8080/demo?a=get同步请求");
}
}.start();
Log.i("--------------","请求完成");
}
/**
* 发送get异步请求
* @param view
*/
public void getAsync(View view) {
getAsyncSend("http://192.168.0.165:8080/demo?a=get异步请求", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("-------------",response.body().string());
}
});
Log.i("--------------","请求完成");
}
/**
* 发送post同步请求
* @param view
*/
public void postSync(View view) {
new Thread(){
@Override
public void run() {
FormBody formBody = new FormBody.Builder().add("a","post同步请求").build();
postSyncSend("http://192.168.0.165:8080/demo",formBody);
}
}.start();
Log.i("--------------","请求完成");
}
/**
* 发送post异步请求
* @param view
* @throws JSONException
*/
public void postAsync(View view) throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("a","post异步请求");
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),"");
postAsyncSend("http://192.168.0.165:8080/demo", requestBody, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("-------------",response.body().string());
}
});
Log.i("--------------","请求完成");
}
/**
* get同步请求使用handler渲染响应数据
* @param url
*/
public void getSyncSend(String url){
Request build = new Request.Builder().url(url).build();
OkHttpClient okHttpClient = new OkHttpClient();
try {
Response execute = okHttpClient.newCall(build).execute();
Message message = new Message();
message.what = 1;
message.obj = execute.body().string();
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* get同步请求
* @param url
* @param callback
*/
public static void getAsyncSend(String url, Callback callback){
Request build = new Request.Builder().url(url).build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(build).enqueue(callback);
}
/**
* post同步
* @param url
* @param requestBody
*/
public void postSyncSend(String url,RequestBody requestBody){
Request build = new Request.Builder().url(url).post(requestBody).build();
OkHttpClient okHttpClient = new OkHttpClient();
try {
Response execute = okHttpClient.newCall(build).execute();
Log.i("------------------",execute.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* post异步
* @param url
* @param requestBody
* @param callback
*/
public static void postAsyncSend(String url, RequestBody requestBody, Callback callback){
Request build = new Request.Builder().url(url).post(requestBody).build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(build).enqueue(callback);
}
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case 1:
view.setText(msg.obj.toString());
}
}
};
}