UI
recyclerView
导入包,gradle
compile 'com.android.support:design.25.3.1'
线性布局:
layout_margin 外边距
layout_padding 内边距
gravity=center 内部元素对齐方式
layout_gravity=center 当前组件的对齐方式
相对布局:
align_bottom🆔 跟…底部对齐
alignParentBottom=true 跟父空间底部对齐
TextView:
maxline=1
ellipSize=end ----用…代替容不下的
下划线,中划线
ScrollView和HorizontalScrollView:
内部只能有一个同级布局
一些基础
选项卡
<TabHost 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:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TabWidget
android:layout_width="match_parent"
android:id="@android:id/tabs"
android:layout_height="wrap_content">
</TabWidget>
<FrameLayout
android:layout_width="match_parent"
android:id="@android:id/tabcontent"
android:layout_height="match_parent">
</FrameLayout>
</LinearLayout>
</TabHost>
package com.example.tabhost;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TabHost;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabHost tabHost = findViewById(android.R.id.tabhost);
tabHost.setup();
LayoutInflater inflater = LayoutInflater.from(this);
inflater.inflate(R.layout.left, tabHost.getTabContentView());
inflater.inflate(R.layout.right, tabHost.getTabContentView());
tabHost.addTab(tabHost.newTabSpec("left")
.setIndicator("高锦良").setContent(R.id.left));
tabHost.addTab(tabHost.newTabSpec("right")
.setIndicator("小丑女").setContent(R.id.right));
}
/** R.layout.left
* <LinearLayout
* android:id="@+id/left"
* android:orientation="vertical"
* android:layout_width="match_parent"
* android:layout_height="match_parent"
* >
*
* <ImageView
* android:layout_width="match_parent"
* android:layout_height="match_parent"
* android:src="@drawable/gao"/>
* </LinearLayout>
*/
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
}
}
网格视图实现QQ相册
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2019-09-11"
android:paddingTop="10dp"
android:paddingBottom="10dp"
/>
<GridView
android:id="@+id/gridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="auto_fit"
android:gravity="center"
android:verticalSpacing="5dp"
android:columnWidth="100dp">
</GridView>
public class MainActivity extends AppCompatActivity {
private int[] picture=new int []{
R.drawable.img1, R.drawable.img2, R.drawable.img3,
R.drawable.img4, R.drawable.img5,
R.drawable.img6, R.drawable.img7, R.drawable.img8, R.drawable.img9
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridView gridView = findViewById(R.id.gridView);
gridView.setAdapter(new ImageAdapter(this));
//网格视图添加适配器
}
public class ImageAdapter extends BaseAdapter{
private Context mContext;
public ImageAdapter(Context mContext) {
this.mContext = mContext;
}
@Override
public int getCount() {
return picture.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ImageView imageView;
if (view==null){
imageView = new ImageView(mContext);
imageView.
setLayoutParams(new GridView.LayoutParams(300, 500));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);//缩放
}
else {
imageView = (ImageView)view;
}
imageView.setImageResource(picture[i]);
return imageView;
}
}
}
单选按钮答题
Button button = findViewById(R.id.bottom);
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()){
if (radioButton.getText().equals("B:2")) {
Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
}
else {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage("2");
builder.setPositiveButton("all right", null);
}
}
}
}
});
下拉列表
<Spinner
android:id="@+id/spinner"
android:entries="@array/ctype"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Spinner>
<!-- <resources>
<string-array name="ctype">
<item>all</item>
<item>movie</item>
<item>book</item>
<item>music</item>
<item>group</item>
<item>activity</item>
</string-array>
</resources>-->
Spinner spinner = findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
String str = adapterView.getItemAtPosition(i).toString();
Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
Intent跳到到电话,发短信
chronometer实现计时
android:gravity="center">
<Chronometer
android:id="@+id/chronometer"
android:layout_width="300dp"
android:layout_height="match_parent"
android:textColor="#3700FF"
android:layout_marginTop="10dp"
tools:ignore="MissingConstraints"
/>
chronometer = findViewById(R.id.chronometer);
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.setFormat("%s");
chronometer.start();
chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
if (SystemClock.elapsedRealtime()-chronometer.getBase()>=10000){
chronometer.stop();
}
}
});
activity之间传递信息
Onclick(){
Intent intent=newIntent(MainActivity.this,AnotherActivity.class);
//intent指向要启动的Activity
new Bundle//包裹
bundle.putCharSequence(" ",str)//包裹装东西
intent.putExtras(bundle)//快递员放入包裹
stratActivity(intent)//快递员开始送包裹
}
//另一个Activity中
intent=getIntent() //快递员到了
bundle=intent.getExtras()//快递员取出包裹
String name=bundle.getString(" ") //拆包裹
textView.setText(name)//用物品
全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏显示
调用另一个Activity并返回结果
Onclick(){
new Intent指向要启动的Activity
startActivityForResult(intent,0x11)//请求码
}
//选择之后重写方法
OnActivityResult(){
boundle=data.getExtras()
int imageId=boundle.getInt(" ") //
imageView.setImageResource( imageId);
}
//在启动的Activity中
intent=getIntent();
new Bundle
boundle.putInt(" ",image[i])//保存图片的数组
intent.putExtras(bundle)
setResult(0x11,intent)
finish()
微信Fragment
//第一个Fragment类
WeChatFragment extends Fragment{
View onCreateView(LayoutInflater inflater,....){
View view=inflater.inflate(R.layout.布局文件,null);
return view;
}
}
//在主Activity
imageView1.setOnClickListener(l);
imageView2.setOnClickListener(l);
imageView3.setOnClickListener(l);
imageView4.setOnClickListener(l);
View.OnClickListener l=new View.OnclickListener(){
void Onclick(View v){
FragmentManager fm=getFragmnetMnagener();
FragmentTransaction ft=fm.beginTransaction();
Fragment f=null;
switch(v.getId){
case R.id.image1:
f=new Fragment1();
break;
case
.....
default:
break;
}
ft.replace(R.id.fragent,f);
ft.commit();
}
};
Intent
1.ComponentName可以调到另一个Activity
Intent intent=new Intent();
ComponentName componentName=new ComponentName("包名","包名.Activity类名");
intent.setComponent(componentName);
startActivity(intent);
2.setAction&setData调到打电话,发信息,浏览器
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button phone = findViewById(R.id.phone);
Button message = findViewById(R.id.message);
phone.setOnClickListener(listener);
message.setOnClickListener(listener);
}
View.OnClickListener listener=new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent();
Button button = (Button) view;
switch (button.getId()){
case R.id.phone:
intent.setAction(intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:17671426524"));
startActivity(intent);
break;
case R.id.message:
intent.setAction(intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:17671426524"));
intent.putExtra("sms_body","Android");
startActivity(intent);
break;
/**
浏览器
intent.setAction(intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
**/
}
}
};
}
//在ManiFest文件中开启权限
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.SEND_SMS" />
3.setFlags
intent.setFlags(intent.FLAG_ACTIVITY_NO_HISTORY);
//不在历史栈中保留,用户一旦离开即关闭
4.intent过滤器跳出打开方式
intent.setAction(intent.ACTION_VIEW);
startActivity(intent);
//在Manifest文件注册的新的ACtivity中添加过滤器
<activity android:name=".AnotherActivity">
<intent-filter>
<action android:name="android.intent.action.View" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
事件
1.再按一次返回
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exit();
return true;
}
return super.onKeyDown(keyCode, event);
}
private void exit() {
if (System.currentTimeMillis() - exitTime > 2000) {
Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
}
2.长按事件唤起菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add("really?");
menu.add("I'so excited");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sure = findViewById(R.id.sure);
sure.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
registerForContextMenu(view);
openContextMenu(view);
return false;
}
});
}
3.单击事件与触摸事件区别
先响应触摸事件,如果触摸事件返回值为false,再响应单击事件
资源
1.在java中使用定义好的string.color,demem,array资源
sure.setText(getResources().getString(R.string.app_name));
title.setColor(getColor(R.color.title))
title.setTextSize(getResources().getDimension(R.demen.title))
String [] strs=getResources.getStringArray(R.array.list)
2.dp=边距,尺寸大小
sp=字体大小
3.在xml文件中使用布局资源
<include layout="@layout/image" />
4.数组资源
新建array.xml文件
<resources>
<string-array name="list">
<item>aa</item>
<item>bb</item>
</string-array>
</resources>
布局资源中使用
<ListView
android:entries="@array/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
5.StateListDrawable资源
在drawable目录下新建xml文件
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:color="#f60"></item>
<item android:state_focused="false" android:color="#0a0"></item>
</selector>
使用xml文件
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="YES"
android:textColor="@drawable/focus"
android:id="@+id/yes"
android:layout_below="@id/text"
android:layout_alignRight="@id/text"
/>
6.主题资源
1.使用系统自带主题
2.自定义主题
在style.xml文件中
<style name="bgTheme" parent="AppTheme">
<item name="windowNoTitle">false</item>
<item name="android:windowBackground">@drawable/ic_launcher_background
</item>
</style>
在manifest.xml中使用
android:theme="@style/bgTheme">
在java中使用
在setContentView之前
setTheme(R.style.byTheme)
样式资源
在style.xml中定义
<style name="title">
<item name="android:textSize">30sp</item>
<item name="android:textColor">#06f</item>
</style>
<style name="context" parent="title">
<item name="android:textSize">18sp</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">@color/colorPrimaryDark</item>
<item name="android:layout_gravity">center_horizontal</item>
</style>
使用
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="高锦良"
style="@style/title"/>
页面actionbar选项菜单
1.在res下新建menu目录,目录下新建menu.xml
2.写菜单
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/message" android:title="message"></item>
<item android:id="@+id/homepage" android:title="homepage"/>
<item android:id="@+id/help" android:title="help"></item>
<item android:id="@+id/feedback" android:title="feedback"></item>
</menu>
3.重写onCreateOptionMenu方法,解析菜单资源文件,添加页面选项菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
4.重写onOptionsItemSlected方法,添加选项菜单响应事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.message:
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
break;
case R.id.homepage:
Intent intent1 = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent1);
}
return super.onOptionsItemSelected(item);
}
组件添加上下文菜单
1.编写menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/copy" android:title="copy"></item>
<item android:id="@+id/collect" android:title="collect"/>
</menu>
2.组件注册上下文菜单
//组件注册上下文菜单对象
Button yes = findViewById(R.id.yes);
registerForContextMenu(yes);
或者
Button sure = findViewById(R.id.sure);
sure.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
registerForContextMenu(view);
openContextMenu(view);
return false;
}
});
3.重写方OcreateContextMenu法创建上下文菜单,解析menu.xml
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu, menu);
}
4.重写onContextItemSlected方法为菜单添加响应事件
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.copy:
Toast.makeText(MainActivity.this," copy", Toast.LENGTH_SHORT).show();
break;
case R.id.collect:
Toast.makeText(MainActivity.this, "collect", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
ActionBar
manifest设置整个应用或一个actionbar的显示隐藏
修改theme属性即可
控制actionbar的显示隐藏
final ActionBar actionBar = getSupportActionBar();
sure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
actionBar.show();
}
});
yes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
actionBar.hide();
}
});
添加actionItem
1.编写菜单资源文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
android:icon="@mipmap/ic_launcher"
android:title="search" //长按图标显示标题
app:showAsAction="always"></item>
<item android:id="@+id/bell"
android:icon="@mipmap/ic_launcher"
android:title="bell"
app:showAsAction="ifRoom">//如果有空间就显示
</item>
<item
android:id="@+id/about"
android:title="about"
app:showAsAction="never"></item>//隐藏在...中
<item
android:id="@+id/settings"
android:title="settings"
app:showAsAction="never" />
</menu>
2.重写方法,解析菜单文件,设置页面的选项菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater =getMenuInflater() ;//一定要写成实例化,否则都隐藏在...
menuInflater.inflate(R.menu.actionbar, menu);
return super.onCreateOptionsMenu(menu);
}
actionView实现actionbar搜索功能
1.编写资源文件
<item android:id="@+id/search"
android:title="search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"></item>//注意app前缀
<item android:id="@+id/img1"
android:title="add">
app:actionLayout="@layout/activity_main"//注意app前缀
</item>//应用一个布局文件,里面设置了icon,位置,大小等资源
2.重写方法绘制页面optionmenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater =getMenuInflater() ;
menuInflater.inflate(R.menu.actionview, menu);
return super.onCreateOptionsMenu(menu);
}
层级式导航(跳出的新页面中有向左的箭头)
1.在父Activity组件中添加事件监听器
Button toButton = findViewById(R.id.to);
toButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, ToActivity.class);
startActivity(intent);
}
});
2.在ToActivity中设置导航图标显示
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_to);
//如果父Activity不为空,则设置导航图标显示
if (NavUtils.getParentActivityName(ToActivity.this) != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//设置向左的箭头图标
}
}
3.在manifest中配置父Activity
<activity android:name=".ToActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
AlertDialog对话框
普通对话框:
1.AlertDialog
2. setIcon
setTitle
setMessage
setButton
3.show()
列表对话框
1.AlertDialog.Builder
2. setIcon
setTitle
setItems() setSingleChoiceItems() setMultiChoiceItems()
setPositiveBotton
builder.create().show()
Button b1 = findViewById(R.id.yesorno);
Button b2 = findViewById(R.id.list);
Button b3 = findViewById(R.id.radioButton);
Button b4 = findViewById(R.id.checkbox);
b1.setOnClickListener(new View.OnClickListener() {//带取消确定按钮的对话框
@Override
public void onClick(View view) {
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
//在页面中创建对话框
alertDialog.setIcon(R.drawable.ic_launcher_background);
alertDialog.setTitle("高锦良");
alertDialog.setMessage("I love you");
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "no", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this, "不再想想嘛", Toast.LENGTH_SHORT).show();
}
});
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this, "对你好一辈子", Toast.LENGTH_SHORT).show();
}
});
alertDialog.show();
}
});
b2.setOnClickListener(new View.OnClickListener() {//带列表显示的对话框
@Override
public void onClick(View view) {
final String[] items = new String[]{
"1", "2", "3", "4"
};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher_background);
builder.setTitle("你喜欢我哪一点");
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this, "你喜欢我" + items[i] + "对吗", Toast.LENGTH_SHORT).show();
}
});
builder.create().show(); //创建并显示对话框
}
});
b3.setOnClickListener(new View.OnClickListener() {//单选列表
@Override
public void onClick(View view) {
final String[] items = new String[]{
"1", "2"
};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher_background);
builder.setTitle(" choose");
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this, "you choose " + items[i] + " right", Toast.LENGTH_SHORT).show();
}
});//添加列表项,设置默认选中,并添加监听器
builder.setPositiveButton("确定", null);
builder.create().show();
}
});
b4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View view){
final boolean[] checkItems = new boolean[]{
false, false, false
};
final String[] items = new String[]{
"gao", "jin", "liang"
};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher_background);
builder.setTitle("What do you like");
builder.setMultiChoiceItems(items, checkItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
checkItems[i] = b;//改变是否选中状态数组
}
});
//添加多选列表目录和状态
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String result = "";
for (int j = 0; j < checkItems.length; j++) {
if (checkItems[j]) {
result += items[j] + ",";
}
}
if (!result.equals("")) {
Toast.makeText(MainActivity.this, "you like" + result, Toast.LENGTH_SHORT).show();
}
}
});//点击确定,获取结果,发生事件
builder.create().show();
}
});
BroadCastReceiver
1.发广播
Button b1 = findViewById(R.id.b1);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("gao");
sendBroadcast(intent);
//或者sendBroadcast(new Intent().setAction("gao"));
}
});
2.新建BroadCastReceiver向导,收到广播后toast
public class MyReceiver extends BroadcastReceiver {
private static final String ACTION1 = "gao";
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
if (intent.getAction().equals(ACTION1)) {
Toast.makeText(context, "myReceiver收到gao", Toast.LENGTH_SHORT).show();
}
throw new UnsupportedOperationException("Not yet implemented");
}
}
3.manifest文件
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="gao" />
</intent-filter>
</receiver>
通知
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification.Builder notification = new Notification.Builder(MainActivity.this);
notification.setAutoCancel(true);//通知打开后自动消失
notification.setSmallIcon(R.drawable.ic_launcher_background);
notification.setContentTitle("大奖来袭");
notification.setContentText("点击查看详情");
notification.setWhen(System.currentTimeMillis());//设置通知发送时间
notification.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
//设置通知的声音和振动
Intent intent = new Intent(MainActivity.this, ToActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
notification.setContentIntent(pendingIntent);
notificationManager.notify(NOTIFYID, notification.build());
//点击通知跳转,而不是立即启动intent
}
final int NOTIFYID=0x123;//通知ID
设置闹钟
1.布局一个timePicker 和一个确定按钮
<TimePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timePicker"
android:layout_gravity="center">
</TimePicker>
<Button
android:id="@+id/setAlarm"
android:text="设置"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
2.新建弹出的闹钟Activity
package com.example.alarmclock;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
public class AlarmActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setIcon(R.drawable.ic_launcher_background);
alertDialog.setTitle("闹钟时间");
alertDialog.setMessage("起床了,小懒猪");
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
alertDialog.show();
}
}
3.在主界面为Button添加响应事件
final TimePicker timePicker = findViewById(R.id.timePicker);
timePicker.setIs24HourView(true);
Button b2 = findViewById(R.id.setAlarm);
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, AlarmActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
calendar.set(Calendar.MINUTE, timePicker.getCurrentMinute());
calendar.set(Calendar.SECOND, 0);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Toast.makeText(MainActivity.this, "闹钟设置成功", Toast.LENGTH_SHORT).show();
}
});
绘制图形
绘制文本
1.自定义MyView,重写onDraw
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint =new Paint():
paint.setColor(0xff000000);
paint.setAntiAlias(true);
paint.setTextAlign(Paint.Align.LEFT);
paint.setTextSize(12);
canvas.drawText("高锦良", 170, 160, paint);//起始的x与y坐标
}
}
2.将View添加到页面的帧布局中
FrameLayout frameLayout = findViewById(R.id.frameLayout);
frameLayout.addView(new MyView(this));
绘制图片
Paint paint =new Paint();
String path = Environment.getExternalStorageDirectory() + "/snail.png";
Bitmap bitmap = BitmapFactory.decodeFile(path);
//根据已有图片绘制bitmap
canvas.drawBitmap(bitmap, 0, 0, paint);//显示bitmap
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 23,89, 150, 168);
//截取成为新的bitmap
canvas.drawBitmap(bitmap1, 270, 50, paint);
绘制路径
Paint paint =new Paint();
paint.setColor(0xffff6600);
paint.setAntiAlias(true);
paint.setTextAlign(Paint.Align.LEFT);
paint.setTextSize(26);//默认单位sp
paint.setStyle(Paint.Style.STROKE);//设置填充方式:描边
Path path=new Path();
path.addCircle(150, 100, 50, Path.Direction.CW);
//圆心,半径,方向(CW:Clockwise)
canvas.drawPath(path, paint);
canvas.drawTextOnPath("I love you", path, 0, 0, paint);
//两种显示路径
逐帧动画
1.编写动画资源文件,在drawable中
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/ic_launcher_background"
android:duration="60">
</item>
<item
android:drawable="drawable/img01"
android:duration="60">
</item>
</animation-list>
2.在主界面应用动画资源
android:background="@drawable/fairy">
3.设置点击播放和暂停
private boolean flag = false;//记录播放状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout linearLayout = findViewById(R.id.layout);
final AnimationDrawable anim = (AnimationDrawable) linearLayout.getBackground();
linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (flag == false) {
anim.start();
flag = true;
} else {
anim.stop();
flag = false;
}
}
});
4.积累:在Manifest设置Activity为横屏
screenOritation:landscape
补间动画
1.在新目录anim中定义动画资源xml,
四个
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:toAlpha="1"
android:fromAlpha="0"
android:duration="2000" />
</set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000" />
</set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1"
android:fromYScale="1"
android:toXScale="2"
android:toYScale="2"
android:pivotY="50%"
android:pivotX="50%"
android:duration="2000"
/>
</set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="300"
android:toYDelta="300"
android:duration="2000"
/>
</set>
2.主界面imageView显示一张图片
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/gao"
/>
3.添加点击事件,为imageView应用动画
final ImageView imageView = findViewById(R.id.imageView);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Animation alpha= AnimationUtils.loadAnimation(MainActivity.this, R.anim.apha);
Animation rotate= AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
Animation scale= AnimationUtils.loadAnimation(MainActivity.this, R.anim.scale);
Animation traslate= AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate);
imageView.startAnimation(traslate);
}
});
设置滑动图片的补间动画效果
1.界面
<ViewFlipper
android:id="@+id/flipper"
android:layout_width="match_parent"
android:layout_height="match_parent"></ViewFlipper>
2.fadein和fadeout动画
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="1"
android:toAlpha="0"
android:duration="4000"/>
</set>
3.给ViewFlipper添加图片和动画
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {
ViewFlipper flipper;
GestureDetector detector = new GestureDetector(this, this);
final int distance = 50;//手势动作两点最小距离
int[] image = new int[]{
R.drawable.gao, R.drawable.yun
};
Animation fade_in = AnimationUtils.loadAnimation(this, R.anim.fade_in);
Animation fade_out = AnimationUtils.loadAnimation(this, R.anim.fade_out);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
flipper = findViewById(R.id.flipper);
for (int i = 0; i < image.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setImageResource(image[i]);
flipper.addView(imageView);
}
// flipper.setInAnimation(fade_in);
// flipper.setOutAnimation(fade_out);
// final ImageView imageView = findViewById(R.id.imageView);
// imageView.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
// Animation alpha= AnimationUtils.loadAnimation(MainActivity.this, R.anim.apha);
// Animation rotate= AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
// Animation scale= AnimationUtils.loadAnimation(MainActivity.this, R.anim.scale);
// Animation traslate= AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate);
// imageView.startAnimation(scale);
// }
// });
}
@Override
public boolean onDown(MotionEvent motionEvent) {
return false;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
return false;
}
@Override
public void onLongPress(MotionEvent motionEvent) {
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
if (motionEvent.getX() - motionEvent1.getX() > distance) {
flipper.setInAnimation(fade_in);
flipper.setOutAnimation(fade_out);
flipper.showPrevious();
return true;
} else {
flipper.setInAnimation(fade_in);
flipper.setOutAnimation(fade_out);
flipper.showNext();
return true;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return detector.onTouchEvent(event);
//将该Activity上的触碰事件交给GestureDetector处理
}
}
多媒体应用开发
MediaPlayer
boolean flag = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.carmen);
Button playOrPause = findViewById(R.id.playOrPause);
// Button pause = findViewById(R.id.pause);
Button stop = findViewById(R.id.stop);
playOrPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (flag==false) {
mediaPlayer.start();
flag = true;
}else {
mediaPlayer.pause();
flag=false;
}
}
});
/*pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.pause();
}
});*/
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.stop();
}
});
SoundPool
1.界面布局
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/bell"></ListView>
<resources>
<array name="bell">
<item >song1</item>
<item>song2</item>
</array>
</resources>
2.监听器事件
ListView listView = findViewById(R.id.listView);
AudioAttributes attr = new AudioAttributes.Builder() //音效
.setUsage(AudioAttributes.USAGE_MEDIA)//设置音效使用场景
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)//设置音效类型
.build();//别忘了
final SoundPool soundPool = new SoundPool.Builder()
.setAudioAttributes(attr)//应用音效
.setMaxStreams(3) //音效池最大音频数
.build();
final HashMap<Integer, Integer> soundMap = new HashMap<>();
soundMap.put(0, soundPool.load(this, R.raw.carmen, 1));
soundMap.put(1, soundPool.load(this, R.raw.meditation, 1));
//将要播放的音频跑存到HashMap中
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
soundPool.play(soundMap.get(i), 1, 1,
0, 0, 1);
}
});//点击item触发事件监听器
播放视频
拍照和视频
数据存储
SharedPreferences
1.布局文件
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/user"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/password"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/login"
android:text="登录"/>
2.添加事件
final EditText editText1 = findViewById(R.id.user);
final EditText editText2 = findViewById(R.id.password);
Button login = findViewById(R.id.login);
final SharedPreferences sp = getSharedPreferences("gao", MODE_PRIVATE);
//sp文件名
String userName = sp.getString("username", null);
String passWord = sp.getString("password", null);
if (userName != null && passWord != null) {//之前登陆过,有sp文件的情况下,自动登录
if (userName.equals("ouyang") && passWord.equals("gao")) {
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
}else
Toast.makeText(MainActivity.this,"错误",Toast.LENGTH_SHORT).show();
} else { //第一次登陆
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String inname = editText1.getText().toString();
String inpass = editText2.getText().toString();
SharedPreferences.Editor editor = sp.edit();
if (inname.equals("ouyang") && inpass.equals("gao")) { //密码与服务器上的一致
editor.putString("username", inname);
editor.putString("password", inpass);
editor.commit();
//保存到sp文件中
Intent intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
Toast.makeText(MainActivity.this, "已保存", Toast.LENGTH_SHORT).show();
}else
Toast.makeText(MainActivity.this, "账号或密码错误", Toast.LENGTH_SHORT).show();
}
});
内外部存储
ContentProvider
消息传递
Message实现banner
1.界面
<ViewFlipper
android:id="@+id/viewFlipper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</ViewFlipper>
2.添加图片和动画资源,内部类定义handler,并发送一个消息
public class MainActivity extends AppCompatActivity {
private static final int FLAG_MSG =0x001 ;
int[] images = new int[]{
R.drawable.yun,R.drawable.gao,R.drawable.img1
};
private ViewFlipper viewFlipper;
private Message message;
Handler handler = new Handler(){//定义全局对象并如何处理消息
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == FLAG_MSG) {
viewFlipper.showPrevious();
message = handler.obtainMessage(FLAG_MSG);
handler.sendMessageDelayed(message, 3000);
//三秒后handler再次发送消息
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewFlipper = findViewById(R.id.viewFlipper);
for (int i = 0; i < images.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setImageResource(images[i]);
viewFlipper.addView(imageView);
}
Animation in = AnimationUtils.loadAnimation(this, R.anim.fade_in);
Animation out = AnimationUtils.loadAnimation(this, R.anim.fade_out);
viewFlipper.setInAnimation(in);
viewFlipper.setOutAnimation(out);
message = Message.obtain();//获得消息对象
message.what = FLAG_MSG;//设置消息代码
handler.sendMessage(message);//handler发送消息
}
}
handler实现倒计时进度条
1.布局
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="10dp"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:max="60"
/>
2.handler发送消息
private ProgressBar timer;
int time=60;
private int TIMER_MSG=0x001;
Handler handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (time > 0) {
time--;
timer.setProgress(time);
handler.sendEmptyMessageDelayed(TIMER_MSG, 1000);
//每隔一秒发送001代码的消息
} else {
Toast.makeText(MainActivity.this,"time up",Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = findViewById(R.id.progressBar);
handler.sendEmptyMessage(TIMER_MSG);
service
boundService
IntentService
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191017104025480.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDM1OTM0OQ =500x300,size_1,color_FFFFFF,t_70)
定位与地图
获取经纬度
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019101712393599.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDM1OTM0OQ#pic_center =500x300,size_1,color_FFFFFF,t_70)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.textView);
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// Activity#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for Activity#requestPermissions for more details.
return;
}
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
locationUpdates(location);
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
1000,//一秒更新一次
1,//一米更新
new LocationListener() {
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
});
}
private void locationUpdates(Location location) {
if (location != null) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("经度" + location.getLongitude() + "\n");
stringBuilder.append("纬度" + location.getLatitude() + "\n");
stringBuilder.append("海拔" + location.getAltitude() + "\n");
text.setText(stringBuilder.toString());
}else
Toast.makeText(MainActivity.this,"没有GPS信号", Toast.LENGTH_SHORT).show();
}
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
百度地图API开发地图
1.开发者秘钥
C:\Users\Administrator.android 找到key.store文件
cmd命令:
keytool -list -v -keystore debug.keystore
( keytool 是Java 提供的一个关于鉴权的命令 ,使用这个命令的话,要定位到JAVA 的bin 目录下)
复制文件到java/bin
cmd:
C:\Program Files\Java\jdk1.8.0_211\bin>keytool -list -v -keystore debug.keystore
秘钥库口令直接回车
得到sha1,复制到申请的网站
2.下载百度LBS Android SDK
3.配置百度LBS Android SDK
a.Project模式—>
b.libs中放入解压缩的SDK libs目录下的jar文件—>
c.选中这两个文件,右键添加到库
d.src.main目录下新建目录:JNIlibs
e.SDK libs目录下armiabi目录放入JNIlibs目录
f.appplication标记中(第一个Activity标记前)添加秘钥
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="kMyHIRxSv3bcUYR22EKS6Qr3TnDLGsAk" />
g.添加权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4.布局
<com.baidu.mapapi.map.MapView
android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/>
5.初始化地图SDK,管理地图生命周期
private MapView mapView;
/**
* 地图生命周期
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
mapView = null;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
//初始化地图SDk,在布局文件之前
setContentView(R.layout.activity_main);
/**
* 百度地图API
*
*/
mapView = findViewById(R.id.mapview);
百度地图API定位到自己位置
以下是看的源码
package com.example.location;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
public class MainActivity extends AppCompatActivity {
private MapView mMapView; // 定义百度地图组件
private BaiduMap mBaiduMap; // 定义百度地图对象
private LocationClient mLocationClient; //定义LocationClient
private BDLocationListener myListener = new MyLocationListener(); //定义位置监听
private boolean isFirstLoc = true; //定义第一次启动
private MyLocationConfiguration.LocationMode mCurrentMode; //定义当前定位模式
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext()); //初始化地图SDK
setContentView(R.layout.activity_main);
mMapView = (MapView) findViewById(R.id.mapview); //获取地图组件
mBaiduMap = mMapView.getMap(); //获取百度地图对象
mLocationClient = new LocationClient(getApplicationContext()); //创建LocationClient类
mLocationClient.registerLocationListener(myListener); //注册监听函数
initLocation(); //调用initLocation()方法,实现初始化定位
}
private void initLocation() { //该方法实现初始化定位
//创建LocationClientOption对象,用于设置定位方式
LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll"); //设置坐标类型
option.setScanSpan(1000); //1秒定位一次
option.setOpenGps(true); //打开GPS
mLocationClient.setLocOption(option); //保存定位参数与信息
mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL; //设置定位模式
//设置自定义定位图标
BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
.fromResource(R.drawable.ic_launcher_background);
//位置构造方式,将定位模式,定义图标添加其中
MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
mBaiduMap.setMyLocationConfigeration(config); //地图显示定位图标
}
public class MyLocationListener implements BDLocationListener { //设置定位监听器
@Override
public void onReceiveLocation(BDLocation location) {
//销毁后不再处理新接收的位置
if (location == null || mMapView == null)
return;
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) { //如果是第一次定位,就定位到以自己为中心
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); //获取用户当前经纬度
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); //更新坐标位置
mBaiduMap.animateMapStatus(u); //设置地图位置
isFirstLoc = false; //取消第一次定位
}
}
}
@Override
protected void onStart() { //地图定位与Activity生命周期绑定
super.onStart();
mBaiduMap.setMyLocationEnabled(true);
mLocationClient.start();
}
@Override
protected void onStop() { //停止地图定位
super.onStop();
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() { //销毁地图
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
}
以下是跟着敲得代码
public class beifen extends AppCompatActivity {
private MapView mapView;
private BaiduMap baiduMap;
private boolean isFirstLoc = true;
private MyLocationConfiguration.LocationMode locationMode;
private void locationUpdates(Location location) {
MyLocationData locData=new MyLocationData.Builder()
.accuracy(location.getAccuracy())
.direction(100)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
baiduMap.setMyLocationData(locData);//构造定位数据
BitmapDescriptor bitMap= BitmapDescriptorFactory
.fromResource(R.drawable.ic_launcher_background);
locationMode = MyLocationConfiguration.LocationMode.NORMAL;
MyLocationConfiguration config=new MyLocationConfiguration(
locationMode,true,bitMap
);
baiduMap.setMyLocationConfiguration(config);//构造定位配置:模式,bitmap
if (location != null) {
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
//获取当前经纬度
Log.i("location", "纬度:" + location.getLatitude() +
"\n" + "经度:" + location.getLongitude());
if (isFirstLoc) {
MapStatusUpdate statusUpdate = MapStatusUpdateFactory.newLatLng(latLng);
baiduMap.animateMapStatus(statusUpdate);
isFirstLoc = false;
}
}else
Log.i("location", "NOGPS");
}//upDate 方法结束
@Override
protected void onStart() {
super.onStart();
baiduMap.setMyLocationEnabled(true);//开启定位图层
}
@Override
protected void onStop() {
super.onStop();
baiduMap.setMyLocationEnabled(false);//关闭定位图层
}
/**
* 地图生命周期
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
mapView = null;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
//初始化地图SDk,在布局文件之前
setContentView(R.layout.activity_main);
/**
* 百度地图API
*
*/
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// Activity#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for Activity#requestPermissions for more details.
return;
}//权限检查,alt+enter出来的
mapView = findViewById(R.id.mapview);
baiduMap = mapView.getMap();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000,
1,
new LocationListener() {
@Override
public void onLocationChanged(Location location) {
locationUpdates(location);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
});
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
locationUpdates(location);//将最新的locaiton传给该方法
}}