目录
1.建立子线程
//简单线程
new Thread(new Runnable() {//创建子线程
@Override
public void run() {
//功能实现
}
}).start();
//刷新主界面线程
runOnUiThread(new Runnable() {
@Override
public void run() {
//界面刷新代码
}
});
2.获取目的网址信息
public senthttp(){
try {
//创建URL
URL url = new URL("http://120.24.175.2:8080/file");//放网站
//openConnection
HttpURLConnection httpURLConnection =(HttpURLConnection)url.openConnection();
//InputStream
InputStream inputStream = httpURLConnection.getInputStream();
//InputStreamReader
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
//BufferedReader
BufferedReader bufferedReader = new BufferedReader(reader);
String temp = null;
while ((temp = bufferedReader.readLine()) != null) {
//如果不为空就一直取
buffer.append(temp);
}
bufferedReader.close();//关闭
reader.close();
inputStream.close();
Log.e("返回结果:",buffer.toString());//打印结果
json= new JSONObject(buffer.toString());
} catch (MalformedURLException e) {
System.out.println("异常1");
e.printStackTrace();
} catch (IOException e) {
System.out.println("异常2");
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
3.设置固定横屏显示
在 AndroidManifest.xml文件中加入 android:screenOrientation="landscape" 。
<activity
android:name=".MainActivity"
android:screenOrientation="landscape"//加入此句实现横屏显示
android:exported="true">
4.设置app全屏显示
在 onCreate 方法中加入此句。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
5.对屏幕滑动,点击等事件监听,实现特定功能
在上滑事件中,我加入了滑动区域判断,从而可以实现对屏幕指定区域滑动事件的监听并处理。
//new一个手势检测器
GestureDetector detector = new GestureDetector(this,this);
//以下方法为屏幕点击等事件触发
//用GestureDetector处理在该activity上发生的所有触碰事件
public boolean onTouchEvent(MotionEvent me){
return detector.onTouchEvent(me);
}
@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 e1, MotionEvent e2, float velocityX,
float velocityY) {
float minMove = 120; //定义最小滑动距离
float minVelocity = 0; //定义最小滑动速度
float beginX = e1.getX();
float endX = e2.getX();
float beginY = e1.getY();
float endY = e2.getY();
if(beginX-endX>minMove&&Math.abs(velocityX)>minVelocity){ //左滑
//Toast.makeText(this,"左滑",Toast.LENGTH_SHORT).show();
//功能实现
}else if(endX-beginX>minMove&&Math.abs(velocityX)>minVelocity){ //右滑
//Toast.makeText(this,"右滑",Toast.LENGTH_SHORT).show();
//功能实现
}else if(beginX>=1100&&beginX<=1900&&beginY>=200&&beginY<=900) {
if(beginY - endY > minMove && Math.abs(velocityY) > minVelocity) { //上滑
//Toast.makeText(this, "上滑", Toast.LENGTH_SHORT).show();
//功能实现
}else if (endY - beginY > minMove && Math.abs(velocityY) > minVelocity) { //下滑
//Toast.makeText(this, "下滑", Toast.LENGTH_SHORT).show();
//功能实现
}
}
}
6.权限弹窗申请
方法中只示例了一个权限的申请,有多个权限可使用多个if语句进行判断和申请。将需要申请的权限名字替代下面示例中的 ACCESS_FINE_LOCATION 即可。注意,并不是所有权限的申请都会有弹窗提示,有些权限的申请在 AndroidManifest.xml 文件中声明即可。
public void permission(){
//1.先请求判断是否具有对应权限
if(ContextCompat.checkSelfPermission
(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
//根据返回的结果,判断对应的权限是否有。
{
ActivityCompat.requestPermissions
(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},0);
}
}
7.动态弹窗申请打开GPS权限
在需要申请打开GPS是调用以下方法:
public void GPS() {
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean isEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!isEnabled) {
androidx.appcompat.app.AlertDialog.Builder builder = new androidx.appcompat.app.AlertDialog.Builder(this);
builder.setTitle("蓝牙扫描需要开启GPS,是否进入设置开启?").setNegativeButton("取消", null);
builder.setPositiveButton("确认",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(myIntent);
}
});
builder.show();
}
}
8.点击按钮弹窗询问是否退出app
public void outofapp(View view) {
//定义一个新的对话框对象
AlertDialog.Builder alertdialogbuilder=new AlertDialog.Builder(this);
//设置对话框提示内容
alertdialogbuilder.setMessage("确定要退出程序吗?");
//定义对话框2个按钮标题及接受事件的函数
alertdialogbuilder.setPositiveButton("确定",click1);
alertdialogbuilder.setNegativeButton("取消",click2);
//创建并显示对话框
AlertDialog alertdialog1=alertdialogbuilder.create();
alertdialog1.show();
}
private DialogInterface.OnClickListener click1=new DialogInterface.OnClickListener() {
//使用该标记是为了增强程序在编译时候的检查,如果该方法并不是一个覆盖父类的方法,在编译时编译器就会报告错误。
@Override
public void onClick(DialogInterface arg0,int arg1) {
//当按钮click1被按下时执行结束进程
android.os.Process.killProcess(android.os.Process.myPid());
}
};
private DialogInterface.OnClickListener click2=new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0,int arg1)
{
//当按钮click2被按下时则取消操作
arg0.cancel();
}
};
9.修改Android Studio默认app的主题
(新建项目的Empty Activity 模板中app默认主题的按钮为紫色等)
主题文件位置:res.values.themes 。修改下面语句中 parent 后面的内容即可,使用NoActionBar.Bridge 之后,按键就不默认为紫色了。
<style name="Theme.Myblue" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">
10.使用 List 列表集合实现特定对象数组集合
方法示例:
此方法中,创建了一个 Bitmap 类型的List集合,传入一个整形,将返回整形指定数组位置存储的bitmap 对象。
public Bitmap getdirbitmap(int i){
//此方法中list集合在每次方法调用中重复生成
List<Bitmap> list = new ArrayList<Bitmap>();
Matrix matrix = new Matrix();//图形处理
matrix.postScale(0.1f,0.1f);
//创建多个Bitmap对象
Bitmap directionbit5 = ((BitmapDrawable)getResources().
getDrawable(R.drawable.dir1)).getBitmap();
Bitmap directionbit6 = ((BitmapDrawable)getResources().
getDrawable(R.drawable.dir5)).getBitmap();
Bitmap directionbit7 = ((BitmapDrawable)getResources().
getDrawable(R.drawable.dir4)).getBitmap();
Bitmap directionbit8 = ((BitmapDrawable)getResources().
getDrawable(R.drawable.dir6)).getBitmap();
Bitmap directionbit1 = ((BitmapDrawable)getResources().
getDrawable(R.drawable.dir2)).getBitmap();
Bitmap directionbit2 = ((BitmapDrawable)getResources().
getDrawable(R.drawable.dir7)).getBitmap();
Bitmap directionbit3 = ((BitmapDrawable)getResources().
getDrawable(R.drawable.dir3)).getBitmap();
Bitmap directionbit4 = ((BitmapDrawable)getResources().
getDrawable(R.drawable.dir8)).getBitmap();
Bitmap directionbit9 = ((BitmapDrawable)getResources().
getDrawable(R.drawable.dir9)).getBitmap();
//将以上创建的Bitmap对象依次存入List集合 list.add(directionbit1);list.add(directionbit2);list.add(directionbit3);list.add(directionbit4); list.add(directionbit5);list.add(directionbit6);list.add(directionbit7);list.add(directionbit8);
list.add(directionbit9);
//取出想要位置的bitmap图像
Bitmap dir = Bitmap.createBitmap(list.get(i-1),0,0,
directionbit1.getWidth(),directionbit1.getHeight(),matrix,true);
return dir;
}
(下面11点将对此方法中的其他内容进行解释)
11.图像放大缩小处理
(接上面第十点的代码内容)
Matrix matrix = new Matrix();//图形变化处理
matrix.postScale(0.1f,0.1f);//此处是设置图像缩放的数值,此处是将图像x y缩小
//利用上面设置好的缩小数值,在 List 中取出图片并将图片缩小后复制给 dir
Bitmap dir = Bitmap.createBitmap(list.get(i-1),0,0,
directionbit1.getWidth(),directionbit1.getHeight(),matrix,true);
postScale()方法:
public boolean postScale(float sx, float sy, float px, float py)
//第一个参数是X轴的缩放大小,第二个参数是Y轴的缩放大小,第三四个参数是缩放中心点。
12.随机颜色产生
double r = Math.random();//随机数产生, 0.0<=r<1.0
int num = (int) (r*7 + 1); //将随机值转换到 1-7
//Color.BLUE 等数值是int型,直接创建对应数组
int[] color = new int[]{Color.BLUE,Color.GREEN,Color.YELLOW,
Color.LTGRAY,Color.RED,Color.GREEN,Color.YELLOW};
//取颜色
color[num-1];
13.Toast 使用
Toast.makeText(context, "提示消息", Toast.LENGTH_SHORT).show();
14.退出(销毁)当前弹窗 Dialog 的方法
dismiss();
15.Intent 的使用
显示:
Intent intent = new Intent();
intent.setClass(this, OtherActivity.class);//OtherActivity.class 为目的activity
startActivity(intent);
隐式:
Intent intent = new Intent();
intent.setAction(Intent.ACTION);//ACTION 为想要执行的动作
startActivity(intent);
16.SharedPreferences 的使用
//name 为存储数据的文件名, Context.MODE_PRIVATE为操作模式
SharedPreferences sh = this.getSharedPreferences("name", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sh.edit();
edit.putString("x", "123"); //x存储数据的名字即 key,字符串 123 为存储数据的值即 value
edit.commit();
/*
SharedPreferences的四种操作模式:
Context.MODE_PRIVATE:默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会首先检查文件是否存在,存在就往文件追加内容,否则就会创建新文件.
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.
*/
17.Canva虚线绘制
private Paint p;//获取画笔
private Canvas canvasTemp;
p.setPathEffect(new DashPathEffect(new float[]{4, 4}, 0));//设置画笔属性用于绘制虚线
canvasTemp.drawLine(100,100,200,200,p); 绘制坐标(100.100)到(200.200)的虚线
/*
虚线的样式属性(虚实间隔)由new DashPathEffect(new float[]{4, 4}, 0)的new float[]{4, 4}控制
*/
18.添加自己设置的背景,按钮等样式
1.再drawable文件夹下新建文件内容(这里展示了部分属性),文件名为:“myview.xml”:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
//这里是Linearlayout布局的背景颜色
<solid android:color="#FFFFFF" />
//这里是设置边框线的粗细和颜色
<stroke
android:width="1dp"
android:color="@color/black" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
//角的话,里边有参数可以单独设置
<corners android:radius="3dp" />
</shape>
2.在想要引用的控件中以背景的形式引用即可:
19.音频播放
//对象获取
static MediaPlayer player=null;
//判断状态
if (player != null && player.isPlaying()) player.stop();
if (player != null) player.release();
//获取音频资源,位于raw文件夹下
player = MediaPlayer.create(this, R.raw.m9_0);
//播放
try {
if (player != null && !player.isPlaying()) player.start();
}catch(IllegalStateException e){
//WriteLogtoSD("info","MediaPlayer Error."+e.getMessage());
}
20.获取某控件的高宽
//控件的高宽必须在控件被加载出来了才能进行获取,不然获取到的值会是0,因此放入此方法中去获取。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
int h = imageView.getHeight();
int w = imageView.getWidth();
}
21.double取整函数
向上取整:Math.ceil(double a);
向下取整:Math.floor(double a);
四舍五入取整:Math.round(double a);
22.java 保留几位小数
double one = 3.232131;
String str = String.format("%.2f",one);
double two = Double.parseDouble(str);
23.保持常亮的屏幕的状态
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
24.计算经纬度两点间的距离
public double getDistance(double lat1, double lng1, double lat2, double lng2) {
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
+ Math.cos(radLat1) * Math.cos(radLat2)
* Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000d) / 10000d;
s = s * 1000;
return s;
}
注:此博客内容会长期动态更新和增加