Android开发中的一些小知识点记录(41-60)

编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/73076519
Android开发中的一些小知识点记录(1-20) (21-40)

41,android:layout_gravity 与 android:gravity 的区别

  • android:layout_gravity 表示的是当前的View或者ViewGroup在 ViewGroup当中的位置(子控件在父控件中的位置)
  • android:gravity 表示的是当前的 View 或者 ViewGroup的内容所在的位置(控件的内容在控件中的位置)

42,margin和padding的区别

  • margin表示外边距
  • padding表示内边距

这里写图片描述

这里写图片描述
如图:未设边距时,三个边框线是重合的,设置边框线后,margin是外边距,向外扩;padding是内边距,向内扩

43,Android TV开发中获取控件焦点

  在每个控件的布局中设置:

android:focusable="true"

  这样就可以通过遥控器或按键获取到该控件焦点,然后在控件的状态选择器中设置:

<item android:drawable="@drawable/bg_yellow" android:state_focused="true"/>
<item android:drawable="@drawable/bg_normal"/>

  如果不想在状态选择器中设置,也可以在代码中设置:

public class MainActivity extends AppCompatActivity implements View.OnFocusChangeListener {

    private static final String TAG = "MainActivity";
    private Button mButton;
    private EditText mEdittext;
    private LinearLayout mLinearLayout;
    private CheckBox mCheckBox;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }

    public void initView() {
        mButton = (Button) findViewById(R.id.button);
        mEdittext = (EditText) findViewById(R.id.edittext);
        mLinearLayout = (LinearLayout) findViewById(R.id.linearlayout);
        mCheckBox = (CheckBox) findViewById(R.id.checkbox);
    }

    public void initData(){
        mButton.setOnFocusChangeListener(this);
        mEdittext.setOnFocusChangeListener(this);
        mLinearLayout.setOnFocusChangeListener(this);
        mCheckBox.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View view, boolean b) {
        if(b & view == mEdittext){
            view.setBackgroundResource(R.drawable.bg_yellow);
        }else if(b & view == mButton){
            view.setBackgroundResource(R.drawable.bg_red);
        }else if(b & view == mLinearLayout){
            view.setBackgroundResource(R.drawable.bg_green);
        }else {
            view.setBackgroundResource(R.drawable.bg_normal);
        }
    }
}

44,自定义可更改颜色大小等属性的CheckBox

  • 设置CheckBox的button为你自定义的selector
<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:button="@drawable/checkbox_selector"/>
  • 准备checkbox_focus、checkbox_checked、checkbox_normal这三张图片,大小颜色等属性均由图片确定
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@drawable/checkbox_focus"/>
    <item android:state_checked="true" android:drawable="@drawable/checkbox_checked"/>
    <item android:drawable="@drawable/checkbox_normal"/>
</selector>

45,新建assets目录的位置

  在src—>main目录下面,和java、res目录平级,光忘记,记录一下!

46,红橙黄绿青蓝紫的 RGB十六进制表示法

  红    #FF0000
  橙    #FF8000
  黄    #FFFF00
  绿    #00FF00
  青    #00FFFF
  蓝    #0000FF
  紫    #8000FF

47,保证Apk的唯一性

包名唯一和应用程序签名的唯一

48,什么是时间戳

  时间戳:表示的是格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
  时间戳转化为年月日时分秒形式代码:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 时间戳 表示的是格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
        // 一般以long格式表示
        long timestamp = 1514994617;

        String time = formatData("yyyy:MM:dd HH:mm:ss", timestamp);
        // time:2018:01:03 23:50:17
        Log.i(TAG , "time:" + time);
    }

    /**
     * 将时间戳格式化年月日时分秒形式
     */
    public static String formatData(String dataFormat, long timeStamp) {
        if (timeStamp == 0) {
            return "";
        }
        timeStamp = timeStamp * 1000;
        String result = "";
        SimpleDateFormat format = new SimpleDateFormat(dataFormat);
        result = format.format(new Date(timeStamp));
        return result;
    }
}

49,用流读取本地assets文件

InputStream is = getAssets().open("friends.txt");
String json = readTextFile(is);
Log.i(TAG, "json:" + json );
Gson gson = new Gson();
// [] 集合类型  {} 对象类型  集合类型要加List  对象类型直接.class就可以了
List<Friends> friend =  gson.fromJson(json , new TypeToken<List<Friends>>(){}.getType());
Log.i(TAG, "friend:" + friend );

private String readTextFile(InputStream is) {
    String readStr = "";
    BufferedReader br;
    try {
        br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        String tmp;
        while ((tmp = br.readLine()) != null) {
            readStr += tmp;
        }
        br.close();
        is.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return readStr;
}

50,shape.xml 属性使用

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <!--固体填充-->
    <solid android:color="@color/colorAccent"/>
    <!--圆角-->
    <corners android:radius="20dp"/>
    <!--描边 线宽2dp  虚线 长度9dp 实线 长度9dp-->
    <stroke android:color="@color/colorPrimaryDark" android:width="2dp"
        android:dashGap="9dp" android:dashWidth="9dp"/>
    <!--渐变色 可以指定左中右渐变 可以调整角度 逆时针旋转角度 必须是45的倍数-->
    <gradient android:startColor="#FFF" android:centerColor="@color/colorPrimary" android:endColor="#000" android:angle="45"/>

</shape>

51,通过两个点的经纬度计算距离

private const double EARTH_RADIUS = 6378.137;  
private static double rad(double d){  
   return d * Math.PI / 180.0;  
}  
  
public static 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 * 10000) / 10000;  
   return s;  
}  

52,跟进源码的方法

  有时候我们重写了系统方法,并且想查看一下系统方法的关键源码,可以通过在方法中添加堆叠追踪的方法实现。在方法中添加如下代码,你想跟进的系统源码就可以在控制台中打印出来。建议打印出来的最下面的信息就没有必要跟进了,从中间往上面跟进

new Throwable().printStackTrace();

这里写图片描述

53,通过Release版的签名证书打一个Release包

  选中Project点F4出现如下界面:
这里写图片描述

  填写Signing(比如命名为release),Build Types里面的debug和release的Signing Config都改为Signing中添加的那个名字(release)

  在控制台Terminal位置输入gradlew assembleRelease,回车等几分钟,就可以在build---->outputs中找到刚打的Release包

54,compileSdkVersion, minSdkVersion 和 targetSdkVersion三者之间的区别

  compileSdkVersion 用于告诉Gradle 用哪个 Android SDK 版本编译你的应用,建议设置最新的 SDK 版本进行编译

  minSdkVersion 用于设置应用可以正常运行的最低Android SDK 版本

  targetSdkVersion 用于设置你想使用新特性的Android SDK 版本,一般也是设置为最新的 SDK 版本,但设置之前需要进行详细的测试

  一般来说,三者之间的关系如下:minSdkVersion <= targetSdkVersion <= compileSdkVersion

55,android TV开发如何连接adb

  • 用 USB to USB 数据线连接,并需要通过软件或硬件的方式进行打开
    软件方式打开:在系统中找USB连接到PC的选项,勾选打开
    硬件方式打开:在主板上找到一个针脚的帽子,将帽子拔掉

  • 通过adb connect IP地址:端口号,这样的方式打开

56,android中将自己的应用程序设置为launcher

<activity android:name=".activity.SplashActivity"
    android:theme="@style/AppSplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
		// 如果将应用程序设置为launcher,点击home键启动自己的应用
        <category android:name="android.intent.category.HOME" />
        // 如果接收隐式意图的话需设置category.DEFAULT,不然将导致 Intent 匹配失败
        <category android:name="android.intent.category.DEFAULT" />

    </intent-filter>
</activity>

57,2018年3月知识点记录

  在命令行中过滤TAG :adb logcat -s TAG名称
  Android文件目录下能删掉的文件夹: .idea .gradle build文件 gradlew文件和gradle.bat文件
  一大B等于八小b 即 1Byte = 8bit ,八位(比特)等于一字节
  获取内网所有在线设备的ip地址: arp -a
  获取内网ip地址:ipconfig/all, 获取公网ip地址:curl ip.cn,不停地ping ping ip地址 -t ,ctrl +c 停止
  AndroidManifest文件中,permission 和uses-permission权限的区别:uses-permission是指本应用程序正常使用需要申请的权限;permission 是指本应用程序提供给其他应用程序所使用的自定义权限
  开发中要做到数据异步和显示异步,保证应用运行流畅
  百度地图如果只添加了发布版的SHA1值,没有添加开发版的SHA1值,那么使用的AK打出来的Debug包安装在设备上只能显示出来网格,如果添加了开发版的SHA1值,Debug包上就可以出现地图内容
  默认的debug.keystore的秘钥库口令是 android ,查看debug.keystore时使用

58,获取公网IP地址

public void getPublicIP() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            URL infoUrl = null;
            InputStream inStream = null;
            try {
                infoUrl = new URL("http://pv.sohu.com/cityjson?ie=utf-8");
                URLConnection connection = infoUrl.openConnection();
                HttpURLConnection httpConnection = (HttpURLConnection) connection;
                int responseCode = httpConnection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    inStream = httpConnection.getInputStream();
                    BufferedReader br = new BufferedReader(new InputStreamReader(inStream, "utf-8"));
                    StringBuilder sb = new StringBuilder();
                    while ((ip = br.readLine()) != null){
                        sb.append(ip + "\n");
                    }
                    inStream.close();
                    // 从反馈的结果中提取出IP地址
                    int start = sb.indexOf("{");
                    int end = sb.indexOf("}");
                    String json = sb.substring(start, end + 1);
                    if (json != null) {
                        try {
                            JSONObject jsonObject = new JSONObject(json);
                            ip = jsonObject.optString("cip");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

59,设置ViewPager的滑动速度

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.view.animation.Interpolator;
import android.view.animation.OvershootInterpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;

/**
 * ViewPager的滑动速度设置
 */
public class ViewPagerScroller extends Scroller {
    /**
     * 滑动速度
     */
    private int mScrollDuration;

    /**
     * 设置速度速度
     * @param duration
     */
    public void setDuration(int duration){
        this.mScrollDuration = duration;
    }

    public ViewPagerScroller(Context context) {
        super(context);
    }

    public ViewPagerScroller(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, mScrollDuration);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        super.startScroll(startX, startY, dx, dy, mScrollDuration);
    }
	
	// 这里的ViewPager可以换成各种ViewPager的子类,包括竖着滑动的ViewPager等
    public void setViewPagerScrollSpeed(ViewPager viewPager, int speed) {
        try {
            Field field = ViewPager.class.getDeclaredField("mScroller");
            field.setAccessible(true);
            ViewPagerScroller viewPagerScroller = new ViewPagerScroller(viewPager.getContext(), new OvershootInterpolator(0.6F));
            field.set(viewPager, viewPagerScroller);
            viewPagerScroller.setDuration(speed);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

在ViewPager设置Adapter设置之前设置:

ViewPagerScroller scroller = new ViewPagerScroller(this);
// 设置ViewPager的滑动速度为3s钟
scroller.setViewPagerScrollSpeed(mViewPager , 3000);

60,文件存储路径解释

内存卡中保存的内容在/storage/emulated/legacy文件夹或/storage/sdcard0或/mnt/sdcard下找,这三个基本都是对应在/mnt/shell/emulated/0文件夹下

SharedPreference内容保存在/data/data/包名/shared_prefs文件夹下
Gilde图片缓存位置/data/data/包名/cache/image_manager_disk_cache文件夹下

mContext.getCacheDir()是指 /data/data/包名/cache文件夹
mContext.getFilesDir()是指 /data/data/包名/files文件夹
mContext.getExternalCacheDir()是指 /mnt/sdcard/Android/data/包名/cache文件夹
mContext.getExternalFilesDir()是指 /mnt/sdcard/Android/data/包名/files文件夹
mContext.getExternalFilesDir("test")是指 /mnt/sdcard/Android/data/包名/files/test文件夹
mContext.getPackageCodePath()是指 /data/app/包名-1.apk文件夹
mContext.getPackageResourcePath()是指 /data/app/包名-1.apk文件夹
mContext.getDatabasePath("test")是指 /data/data/包名/databases/test文件夹
mContext.getDir("test" , Context.MODE_PRIVATE)是指 /data/data/包名/app_test文件夹

Environment.getDataDirectory() 是指 /data文件夹
Environment.getDownloadCacheDirectory() 是指 /cache文件夹
Envrionment.getExternalStorageDirectory() 是指/mnt/sdcard文件夹
Environment.getRootDirectory 是指/system文件夹
Environment.getExternalStoryPublicDirectory("test") 是指/mnt/sdcard/test文件夹

Android开发中的一些小知识点记录(1-20) (21-40)


因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamBackTo

感谢各位金主大大(* _ *)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值