精华内容
下载资源
问答
  • Android屏幕密度

    2021-06-11 09:29:46
    (之所以要除以160,是因为定义对于dip为160的屏幕,其一个像素与一个dp相同) 4、屏幕大小(Screen Size):屏幕的实际尺寸,指屏幕对角线的长度,单位inch,android中根据屏幕大小,把屏幕氛围几个等级:small、...

    概念:

    一、几个概念

    1、ppi-pixel per inch,ppi单位长度像素个数。计算方法是宽宽 + 长长,然后开方(即对角线的像素个数),然后除以对角线的长度。

    例如iphone4s:960x640像素,对角线3.5英寸,则ppi=(960*960 +640*640)/ 3.5 = 329.6ppi

    2、dpi-dolt per inch,dpi单位长度像素点数,感觉和ppi定义类似,其计算方法也一样,可以粗略理解为两者一样,只不过这里一个点代表一个像素.如果A手机屏幕宽度是5CM,B手机宽度是10Cm,宽度分辨率都是320,那么显示同一张图片时,B手机上的图片就会显的大一点,并且没有A手机上的清晰。为什么呢,这就是我们常见的密度(DPI)概念,即每英寸多少个点。—–(理解dp:屏幕分辨率;px:像素)

    3、dip - density-independent pixel:dip密度无关像素,其实并不是像素,与pixel有如下转换关系:

    px = dp * (dip / 160); (之所以要除以160,是因为定义对于dip为160的屏幕,其一个像素与一个dp相同)

    4、屏幕大小(Screen Size):屏幕的实际尺寸,指屏幕对角线的长度,单位inch,android中根据屏幕大小,把屏幕氛围几个等级:small、normal、large、extra-large

    5、屏幕密度(Screen density):用dpi来表示,android把屏幕密度分为:low、medium, high、extra high

    6、sp(scaled-independent pixel):可以把它理解为dip(或dp),只不过专门用来表示字符大小

    7、分辨率:显示器能够示显的像素多少。(水平×垂直 如1028×768)

    ldpi: 屏幕密度为120的手机设备

    mdpi: 屏幕密度为160的手机设备(此为baseline,其他均以此为基准,在此设备上,1dp = 1px)

    hdpi: 屏幕密度为240的手机设备

    xhdpi: 屏幕密度为320的手机设备

    xxhdpi:屏幕密度为480的手机设备

    如果是480x800的切图,则应该放入drawable-hdpi目录下,

    如果是320x480的切图,则应该放在mdpi目录下。

    如果是720x1280的切图,则应该放在xhdpi目录下。

    把同样图片放在不同的drawable文件夹中,显示效果是不一样的。效果如下

    0818b9ca8b590ca3270a3433284dd417.png

    Tip1:屏幕密度的应用:

    已知:屏幕密度(Screen density):用dpi来表示,android把屏幕密度分为:low、medium, high、extra high。在实际应用中,与图片显示有关。

    0818b9ca8b590ca3270a3433284dd417.png

    从上表可以得出如下结论

    1. 图片放在drawable中,等同于放在drawable-mdpi中,原因为:drawable目录不具有屏幕密度特性,所以采用基准值,即mdpi

    2. 图片放在某个特定drawable中,比如drawable-hdpi,如果设备的屏幕密度高于当前drawable目录所代表的密度,则图片会被放大,否则会被缩小;放大或缩小比例 = 设备屏幕密度 / drawable目录所代表的屏幕密度

    3. 为了更全面的适配所有设备,我们应该提供一套针对主流屏幕密度的图片(目前为hdpi或xhdpi),其他密度通过系统自动缩放得到图片

    Tip2:dp

    dp工作原理

    最关键要记住一个公式:

    android在计算pixel值时会首先判断屏幕的密度。如果我们把mdpi设为1,则hdpi就等于1.5. 如果我们使用dp为单位,android在转换为pixel时会依据下面公式:

    px = dp * density;

    像素数 = dp * 每英寸的逻辑点数。

    dp表示独立像素密度,所谓独立,就是不依赖与屏幕的密度。

    从本质上来看,dp其实表示是相同的物理长度,注:不是以像素为单位,而是以inch为单位。

    例如对于mdpi,长度为m inch的屏幕,其像素数为n1,dp数为n2.

    对于hdpi,也是长度为m inch,包含的像素数为n1 * 1.5. 根据公式可以算出,其dp值为n1 * 1.5 / 1.5 = n1. 对于xhdpi的也是n1.

    即:相同的物理长度其dp值相同。

    float a = this.getResources().getDisplayMetrics().density; //dp

    int b = this.getResources().getDisplayMetrics().densityDpi; //密度值

    可以通过上面的代码来获取当前设备的屏幕密度,a为dp值,b为密度值,如a=1则表示你的设备屏幕类型为Mdpi

    DisplayMetrics dm = new DisplayMetrics();

    dm = cx.getApplicationContext().getResources().getDisplayMetrics();

    int screenWidth = dm.widthPixels; 屏幕宽度

    图片显示:

    android系统加载图片资源遵循下面的规则:首先判断手机的屏幕密度,然后在相应的密度下文件夹中查找图片资源。如果找到,则进行显示。如果找不到,则会从drawable或者其他drawable-*文件夹中寻找。找到后,将文件夹所表示的密度与手机实际密度进行比较,从而缩放图片。例如在drawable下找到资源(等价于从drawable-mdpi),而手机又是hdpi的,这样android在显示图片时会将图片进行放大,以满足hdpi手机显示需要。不难想象,图片肯定会变模糊。

    如果放错文件夹,系统会进行相应的缩放,使图片进行错误的缩放。例如hdpi的图片放到mdpi中,在hdpi的手机显示,会比原图片大

    设计给切图,最好根据那个dpi呢?是都可以吗?一般应该给480*800的hdpi的切图。这样对于mdpi,可以自动缩小。图像显示质量不受影响。对于xdpi,放大幅度不大,图像显示质量影响较小。

    那么为什么不用xhdpi呢,这样都是缩小图像不是更好吗?有两个理由,一是增大了apk的尺寸,另一个就是容易引起切图的变形,影响显示。主要是对于.9的图片,有对某一方向进行了压缩,如果设置时,拉伸区域太小,再压缩时可能变形。当然这也不是绝对的,可以通过增大.9.png文件的拉伸区域来实现。 或许还有个理由,xhpi的机型比较不占多数。

    展开全文
  • android屏幕录制命令

    2021-05-28 08:33:44
    adb shell screenrecord /sdcard/test.mp4 ----------------支持API19(4.4)及以上adb shell screenrecord --time-limit 10 /sdcard/test.mp4 --------限制时间adb shell screenrecord --size 1080x1920/sdca...

    adb shell screenrecord /sdcard/test.mp4       ----------------支持API19(4.4)及以上

    adb shell screenrecord --time-limit 10 /sdcard/test.mp4           --------限制时间

    adb shell screenrecord --size 1080x1920 /sdcard/test.mp4          --------设置分辨率

    adb shell screenrecord --bit-rate 8000000 /sdcard/test.mp4     ---------设置比特率

    adb shell screenrecord --size 1080x1920 --bit-rate 8000000 /sdcard/test.mp4 同时设置分辨率和比特率

    adb pull /sdcard/ test.mp4   ----------------导出视频到本地(路径是DOS中执行这条命令的路径下,现在好像不管用了)

    展开全文
  • 为什么要屏幕适配Android开发...现在Android屏幕分辨率碎片化720x1280、1080x1920、2280x1080,这就造成例如187px会在各个分辨率的机型上都是显示一样大小的,那肯定不是我们想要的效果,所以用px单位我们是难以达...

    为什么要屏幕适配

    Android开发过程中我们常用的尺寸单位有px、dp,还有一种sp一般是用于字体的大小。但是由于px是像素单位,比如我们通常说的手机分辨例如1920*1080都是px的单位。现在Android屏幕分辨率碎片化720x1280、1080x1920、2280x1080,这就造成例如187px会在各个分辨率的机型上都是显示一样大小的,那肯定不是我们想要的效果,所以用px单位我们是难以达到适配效果的,那么为什么用dp可以呢?

    使用px单位从左到右依次为 480 * 800、1080 * 1920、1440 * 2560

    b3978fe417640485849cf515cd479a32.png

    使用dp单位从左到右依次为 480 * 800、1080 * 1920、1440 * 2560

    b6450d533ad7d7cecd296873df751267.png

    屏幕总宽度依次为 320dp、415dp、411dp

    那么什么是dp?

    dp指的是设备独立像素,以dp为尺寸单位的控件,在不同分辨率和尺寸的手机上代表了不同的真实像素,比如在分辨率较低的手机中,可能1dp=1px,而在分辨率较高的手机中,可能1dp=2px,这样的话,一个187dp高度的控件,在不同的手机中就能表现出差不多的大小了。

    dp如何计算成px

    android中的dp在渲染前会将dp转为px,计算公式:

    px = density * dp;

    density = dpi / 160;

    px = dp * (dpi / 160);

    而dpi是根据屏幕真实的分辨率和尺寸来计算的,每个设备都可能不一样的。

    934555721ea126650664f73b00578e12.png

    由于density不是固定不变的,所以每个分辨率不同的设备他们的density都肯定不相等,这样就会造成每个设备的宽/高对应的总dp都是不同的,假设480 * 800分辨率的density是1.5,1080 * 1920分辨率的density是2.6,1440 * 2560分辨率的density是3.5。那么它们对应的宽度总dp = (宽度px) / density,分别为320dp、415dp、411dp。可以看出单位为dp的时候三个设备之间的差距就不是很大了,但是这样肯定还是不能满足我们对屏幕适配的要求的。下面来看看Android常见的三种比较成熟的屏幕适配方案,并分析这几种方案的优劣。

    屏幕适配方案

    1.1 宽高限定符适配

    8f2f490e3cd9a1c4db43f79f855698d4.png

    设定一个基准的分辨率,也就是设计图对应的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件。

    比如我们的设计图 375 * 667为基准分辨率

    宽度为375,将任何分辨率的宽度整分为375份,取值为x1-x375

    高度为667,将任何分辨率的高度整分为667份,取值为y1-y667

    那么对于1080*1920的分辨率的dimens文件来说,

    x1=(1080/375)*1=2.88px

    x2=(1080/375)*2=5.76px

    y1=(1920/667)*1=2.87px

    y2=(1920/667)*2=5.75px

    当代码里面引用高度为y_187,在APP运行时会根据当前设备分辨率去找对应xml文件中对应的高度,我们就可以按照设计稿上的尺寸填写相对应的dimens引用了,这样基本解决了我们的适配问题,而且极大的提升了我们UI开发的效率。

    验证方案

    简单通过计算验证下这种方案是否能达到适配的效果,例如设计图上有一个宽187dp的View。

    480 * 800

    设计图占宽比: 187dp / 375dp = 0.498

    实际在480 * 800占宽比 = 187 * 1.28px / 480 = 0.498

    1080 * 1920

    设计图占宽比: 187dp / 375dp = 0.498

    实际在1080 * 1920占宽比 = 187 * 2.88px / 1080 = 0.498

    计算高同理

    但是这个方案有一个致命的缺陷,那就是需要精准命中才能适配,比如1920x1080的手机就一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形,简单说,就是容错机制很差。

    1.2 smallestWidth适配

    0d8ab2a61fe232f6ddeaf341bc98efbf.png

    smallestWidth适配,或者叫sw限定符适配。指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。

    这种机制和上文提到的宽高限定符适配原理上是一样的,都是系统通过特定的规则来选择对应的文件。

    可以把 smallestWidth 限定符屏幕适配方案 当成这种方案的升级版,smallestWidth 限定符屏幕适配方案 只是把 dimens.xml 文件中的值从 px 换成了 dp,原理和使用方式都是没变的

    ├── src/main

    │ ├── res

    │ ├── ├──values

    │ ├── ├──values-sw320dp

    │ ├── ├──values-sw360dp

    │ ├── ├──values-sw400dp

    │ ├── ├──values-sw411dp

    │ ├── ├──values-sw480dp

    │ ├── ├──...

    │ ├── ├──values-sw600dp

    │ ├── ├──values-sw640dp

    复制代码

    验证方案

    1920 * 1080分辨率的手机,dpi为420,我们同样设置一个View为187dp宽

    density = (dpi = 420) / 160 = 2.6

    屏幕总宽度dp = 1080 / density = 415

    找到文件夹values-sw410dp下的187dp = 204.45dp

    通过公式px = density * dp,计算出px = 531.57

    算出占屏幕宽度的比例,56.86 / 1080 = 0.492

    1440 * 2560分辨率的手机,dpi为560,我们同样设置一个View为187dp宽

    density = (dpi = 420) / 160 = 3.5

    屏幕总宽度dp = 1440 / density = 411

    找到文件夹values-sw410dp下的187dp = 204.45dp

    通过公式px = density * dp,计算出px = 715.57

    算出占屏幕宽度的比例,715.57 / 1440 = 0.496

    因为识别的文件夹是values-sw410dp的文件夹,但是屏幕宽度为415dp和411dp,所以最后计算出的占比会有一点点误差,基本可以忽略不计,可以达到相对比较准确的适配效果

    优点

    非常稳定,极低概率出现意外

    不会有任何性能的损耗

    适配范围可自由控制,不会影响其他三方库

    在插件的配合下,学习成本低

    缺点

    侵入性高,在所有地方都需要引用。

    还是没有办法覆盖所有的机型分辨率,部分机型可能适配效果还是不佳

    不能以高度为基准进行适配

    生成很多文件,增大APP体积1~2M

    1.3 今日头条适配方案

    d8790cf7fc8a226c4b176aafb79434b6.png

    今日头条屏幕适配方案的核心原理在于,根据以下公式算出 density

    默认px = density * dp,也就是屏幕总宽度dp = 屏幕宽度px / density,这个时候我们假设所有设备上的屏幕总宽度dp会等于我们设计图375dp,那么可以得出一个公式:

    density = 屏幕宽度px / 设计图宽度(375dp)

    然后我们通过系统api,将density赋值给系统,抛弃掉系统默认计算density的计算公式。

    这样可以很巧妙的实现屏幕适配,而且侵入性极低,甚至可以忽略不计。

    验证方案

    1920 * 1080分辨率的手机,我们同样设置一个View为187dp宽,设计图宽度为375dp

    density = (屏幕宽度px = 1080) / 375 = 2.88

    View宽度 = density * 187dp = 538.56

    算出占屏幕宽度的比例,57.6 / 1080 = 0.498

    1440 * 2560分辨率的手机,我们同样设置一个View为187dp宽,设计图宽度为375dp

    density = (屏幕宽度px = 1440) / 375 =3.84

    View宽度 = density * 187dp = 718.08

    算出占屏幕宽度的比例,718.08 / 1440 = 0.498

    可以看出,这种方案是完全没有误差的,而且侵入性极低,只需要修改系统的density。虽然修改系统的density属性会产生一小部分影响,但是基本都是很好解决的。

    优点

    使用成本非常低,操作非常简单

    侵入性非常低

    可适配三方库的控件和系统的控件

    缺点

    会全局影响APP的控件大小,例如一些第三方库控件,他们设计的时候可能设计图尺寸并不是像我们一样是375dp,这样就会导致控件大小变形等一些问题。

    参考文章

    广而告之

    本文发布于薄荷前端周刊,欢迎Watch & Star ★,转载请注明出处。

    欢迎讨论,点个赞再走吧 。◕‿◕。 ~

    展开全文
  • 今天用了下Vysor,可以实现屏幕共享和远程控制,并且不需要root,而且可以兼容所有版本Android,功能很是强大,反编译了,下面是根据Vysor源码精简的功能。import android.graphics.Bitmap;import android.graphics....

    今天用了下Vysor,可以实现屏幕共享和远程控制,并且不需要root,而且可以兼容所有版本Android,功能很是强大,反编译了,下面是根据Vysor源码精简的功能。

    import android.graphics.Bitmap;

    import android.graphics.Point;

    import android.hardware.input.InputManager;

    import android.os.Build;

    import android.os.Handler;

    import android.os.SystemClock;

    import android.support.v4.view.InputDeviceCompat;

    import android.view.InputEvent;

    import android.view.KeyEvent;

    import android.view.MotionEvent;

    import java.io.File;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.lang.reflect.InvocationTargetException;

    import java.lang.reflect.Method;

    /**

    * Created by wanjian on 2017/4/4.

    */

    public class Main {

    private static InputManager im;

    private static Method injectInputEventMethod;

    private static long downTime;

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, FileNotFoundException {

    if ("screenshot".equals(args[0])) {

    screenShot();

    return;

    }

    initEvent();

    if ("home".equals(args[0])) {

    System.out.println("home");

    pressHome();

    return;

    }

    if ("touch".equals(args[0])) {

    System.out.println("slide");

    slideScreen();

    return;

    }

    if ("back".equals(args[0])) {

    System.out.println("back");

    back();

    return;

    }

    }

    private static void screenShot() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, FileNotFoundException {

    System.out.println("started screenshot");

    Point size = new Point();

    size.x = 1080;

    size.y = 1920;

    String surfaceClassName;

    if (Build.VERSION.SDK_INT <= 17) {

    surfaceClassName = "android.view.Surface";

    } else {

    surfaceClassName = "android.view.SurfaceControl";

    }

    Bitmap b = (Bitmap) Class.forName(surfaceClassName).getDeclaredMethod("screenshot", new Class[]{Integer.TYPE, Integer.TYPE}).invoke(null, new Object[]{Integer.valueOf(size.x), Integer.valueOf(size.y)});

    System.out.println(b);

    File file = new File("/sdcard/myscreenshot");

    if (!file.exists()) {

    file.mkdirs();

    }

    b.compress(Bitmap.CompressFormat.JPEG, 60, new FileOutputStream(new File(file, System.currentTimeMillis() + ".jpg")));

    System.out.println("finished " + file.getAbsolutePath());

    }

    private static void back() throws InvocationTargetException, IllegalAccessException {

    sendKeyEvent(im, injectInputEventMethod, InputDeviceCompat.SOURCE_KEYBOARD, 4, false);

    }

    private static void slideScreen() throws InvocationTargetException, IllegalAccessException {

    final float clientX = 900;

    final float clientY = 200;

    touchDown(clientX, clientY);

    final Handler handler = new Handler();

    handler.postDelayed(new Runnable() {

    int i = 0;

    float mClientX = clientX;

    @Override

    public void run() {

    if (i++ > 300) {

    try {

    touchUp(mClientX, clientY);

    } catch (Exception e) {

    e.printStackTrace();

    }

    return;

    }

    mClientX -= 3;

    try {

    touchMove(mClientX, clientY);

    } catch (Exception e) {

    e.printStackTrace();

    }

    handler.postDelayed(this, 10);

    }

    }, 10);

    }

    private static void touchUp(float clientX, float clientY) throws InvocationTargetException, IllegalAccessException {

    injectMotionEvent(im, injectInputEventMethod, InputDeviceCompat.SOURCE_TOUCHSCREEN, 1, downTime, SystemClock.uptimeMillis() - downTime, clientX, clientY, 1.0f);

    }

    private static void touchMove(float clientX, float clientY) throws InvocationTargetException, IllegalAccessException {

    injectMotionEvent(im, injectInputEventMethod, InputDeviceCompat.SOURCE_TOUCHSCREEN, 2, downTime, SystemClock.uptimeMillis() - downTime, clientX, clientY, 1.0f);

    }

    private static void touchDown(float clientX, float clientY) throws InvocationTargetException, IllegalAccessException {

    downTime = SystemClock.uptimeMillis();

    injectMotionEvent(im, injectInputEventMethod, InputDeviceCompat.SOURCE_TOUCHSCREEN, 0, downTime, downTime, clientX, clientY, 1.0f);

    }

    private static void pressHome() throws InvocationTargetException, IllegalAccessException {

    //home键

    sendKeyEvent(im, injectInputEventMethod, InputDeviceCompat.SOURCE_KEYBOARD, 3, false);

    }

    private static void initEvent() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

    im = (InputManager) InputManager.class.getDeclaredMethod("getInstance", new Class[0]).invoke(null, new Object[0]);

    MotionEvent.class.getDeclaredMethod("obtain", new Class[0]).setAccessible(true);

    injectInputEventMethod = InputManager.class.getMethod("injectInputEvent", new Class[]{InputEvent.class, Integer.TYPE});

    }

    private static void injectMotionEvent(InputManager im, Method injectInputEventMethod, int inputSource, int action, long downTime, long eventTime, float x, float y, float pressure) throws InvocationTargetException, IllegalAccessException {

    MotionEvent event = MotionEvent.obtain(downTime, eventTime, action, x, y, pressure, 1.0f, 0, 1.0f, 1.0f, 0, 0);

    event.setSource(inputSource);

    injectInputEventMethod.invoke(im, new Object[]{event, Integer.valueOf(0)});

    }

    private static void injectKeyEvent(InputManager im, Method injectInputEventMethod, KeyEvent event) throws InvocationTargetException, IllegalAccessException {

    injectInputEventMethod.invoke(im, new Object[]{event, Integer.valueOf(0)});

    }

    private static void sendKeyEvent(InputManager im, Method injectInputEventMethod, int inputSource, int keyCode, boolean shift) throws InvocationTargetException, IllegalAccessException {

    long now = SystemClock.uptimeMillis();

    int meta = shift ? 1 : 0;

    injectKeyEvent(im, injectInputEventMethod, new KeyEvent(now, now, 0, keyCode, 0, meta, -1, 0, 0, inputSource));

    injectKeyEvent(im, injectInputEventMethod, new KeyEvent(now, now, 1, keyCode, 0, meta, -1, 0, 0, inputSource));

    }

    }

    首先把这端代码编译成class文件,然后转成dex文件

    dx --dex --output=Main.dex Main.class

    把转换好的dex文件发送到手机上

    adb push Main.dex /sdcard/Main.dex

    进入shell

    adb shell

    执行命令

    export CLASSPATH=/sdcard/Main.dex

    执行截屏命令,执行后会放到/sdcard/myscreenshot文件夹下,vysor就是通过不停的截屏实现的屏幕共享

    exec app_process /sdcard Main screenshot

    执行按下home按键

    exec app_process /sdcard Main home

    执行按下返回按键

    exec app_process /sdcard Main back

    执行触屏事件

    exec app_process /sdcard Main touch

    完整命令如下:

    MGJwanjian:sss wanjian$ dx --dex --output=Main.dex Main.class

    MGJwanjian:sss wanjian$ adb push Main.dex /sdcard/Main.dex

    [100%] /sdcard/Main.dex

    MGJwanjian:sss wanjian$ adb shell

    shell@mx5:/ $ export CLASSPATH=/sdcard/Main.dex

    shell@mx5:/ $ exec app_process /sdcard Main screenshot

    started screenshot

    android.graphics.Bitmap@13c1ffa9

    finished /sdcard/myscreenshot

    MGJwanjian:sss wanjian$ adb shell

    shell@mx5:/ $ export CLASSPATH=/sdcard/Main.dex

    shell@mx5:/ $ exec app_process /sdcard Main home

    home

    MGJwanjian:sss wanjian$ adb shell

    shell@mx5:/ $ export CLASSPATH=/sdcard/Main.dex

    shell@mx5:/ $ exec app_process /sdcard Main back

    back

    MGJwanjian:sss wanjian$ adb shell

    shell@mx5:/ $ export CLASSPATH=/sdcard/Main.dex

    shell@mx5:/ $ exec app_process /sdcard Main touch

    slide

    MGJwanjian:sss wanjian$ adb shell

    shell@mx5:/ $ export CLASSPATH=/sdcard/Main.dex

    shell@mx5:/ $ exec app_process /sdcard Main touch

    slide

    补:关于如何把java文件打包成class文件

    最简单的方式:

    在android studio中右击com.wanjian.puppet.Main这个文件,选择 run Main.main(),编译后的class文件就会自动保存到

    androidScreenShareAndControl/shareandcontrollib/build/intermediates/classes/debug 这个目录中

    方式2:

    把 android sdk目录下的android.jar和supportv4.jar拷贝到

    androidScreenShareAndControl/shareandcontrollib/src/main/java

    目录下,同时在这个目录下新建classes文件夹,用于保存编译后的class文件,并把命令行切换到这个目录

    执行如下命令,其中android.jar和support-v4-23.4.0-sources.jar 是android sdk中的jar包,一个在platforms/android-xx文件夹下,一个在extras/android/m2repository/com/android/support/support-v4下

    中间用:分割,windows的话需要用;分割

    javac -cp android.jar:support-v4-23.4.0-sources.jar:./  com/wanjian/puppet/Main.java  -d classes

    这样就会在classes文件夹中生成class文件了(JDK版本不能太高,不然会提示 unsupported class file version 52.0)

    99d03e705532e5b7995a40e71bc3b284.png

    展开全文
  • * Created by水东流on 2018/2/26 0026.*/public classPowerFullLayoutextendsFrameLayout{ //屏幕宽高private intscreenHeight;private intscreenWidth;privateViewDragHelpermDragHelper;private ...
  • Android 屏幕设置

    2021-05-26 07:00:09
    修改Android项目的AndroidManifest.xml设置:1、控制屏幕方向(横屏/竖屏),默认自动切换,修改Activity的配置://竖屏android:screenOrientation="portrait"//横屏android:screenOrientation="landscape"2、不显示...
  • Android屏幕适配

    2021-06-05 17:16:50
    为什么要进行Android屏幕适配由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,于是导致:1、Android系统碎片化:小米定制的MIUI、魅族定制的flyme、华为定制的EMUI等等2、...
  • 首先,须要启动一个后台服务,用于注册一个BroadcastReceiverandroid这个BroadcastReceiver用于监听Intent.ACTION_SCREEN_OFFapp这样在发生这个事件Intent.ACTION_SCREEN_OFF 也就是用户锁屏或者屏幕上锁时触发。...
  • Android 屏幕实现上下翻转发布时间:2020-08-23 12:17:38来源:脚本之家阅读:86作者:oracleotAndroid 屏幕实现上下翻转通常我们的应用只会设计成横屏或者竖屏,锁定横屏或竖屏的方法是在manifest.xml文件中设定...
  • 在我们学习如何进行屏幕适配之前,我们需要先了解下为什么Android需要进行屏幕适配。由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,修改成他们想要的样子。但是这种“碎片化...
  • Android屏幕分辨率各种各样,碎片化严重,开发者苦不堪言,转身看看iOS开发同学,只要适配2个尺寸的屏幕就好了,= =!但我们总是能克服的对不,假如我们现在有这么一个需求:我们将满屏显示一张网络图片,希望它不要...
  • #禁止旋转 adb shell content insert --uri content://settings/system --bind name:s:accelerometer_rotation --bind value:i:0 #陀螺仪控制 #屏幕翻转 adb shell content insert --uri content://settings/system ...
  • 今天记录的笔记是今日头条的适配方案原理以及开源库”AndroidAutoSize“的实现剖析!...感谢作者JessYan适配的前提是你需要知道安卓适配的基础知识和基本方法 《Android屏幕适配-第一篇(基础知识)》、《Android...
  • 为什么使用百分比布局由于Android系统的碎片化发展导致了市面上多种分辨率、多种屏幕密度共存,这对我们的屏幕适配增加了不少的难度,在布局方面我们都知道可以通过LinearLayout的layout_weight属性来进行适配,但是...
  • Android屏幕旋转

    2021-05-26 09:02:02
    很久没有写文章了,找个时间整理下Android简单的屏幕旋转的生命周期和正确的竖屏锁定设置生命周期启动Activity会执行如下方法:onCreate –> onStart –> onResume之后旋转屏幕,则Activity会被销毁并重新创建...
  • 1 Android屏幕适配的度量单位和相关概念 建议在阅读本文章之前,可以先阅读快乐李同学写的文章《Android屏幕适配的度量单位和相关概念》,这篇文章包含了阅读本文的一些基础知识,推荐阅读。 2 Android屏幕适配的...
  • https://github.com/JessYanCoding/AndroidAutoSize https://www.wanandroid.com/blog/show/2343 https://www.jianshu.com/p/12ce5c0a6163 implementation 'me.jessyan:autosize:1.2.1' <manifest> <...
  • 重要概念什么是屏幕尺寸、屏幕分辨率(px)、屏幕像素...1、屏幕尺寸含义:手机对角线的物理尺寸单位:英寸(inch),1英寸=2.54cmAndroid手机常见的尺寸有5寸、5.5寸、6寸等等2、屏幕分辨率(px)含义:手机在横向、纵...
  • 注意:需要系统签名(本文是在没有源码的情况下,使用platform.pk8、platform.x509.pem、signapk.jar来进行系统签名)开发工具用的是eclipse,android studio还没试过。步骤:1、在eclipse新建项目,在MainActivity中...
  • } } ScreenCap.cpp: #include #include #include #include #include #include #include #include #include "com_cust_android_screencap_ScreenCap.h" using namespace android; /* * Class: ...
  • 3、能够62616964757a686964616fe78988e69d8331333337373664使用权重的地方尽量使用权重(android:layout_weight)4、如果是纯色背景,尽量使用android的shape 自定义。5、如果需要在特定分辨率下适配,可以在res目...
  • 严格来说,作为读者,你应该带着批判性质的眼光来看这篇文章,此文章...一、Android支持的多种屏幕传统意义上,一般是是这么认为的:ldpi: 对应分辨率240×320mdpi: 对应分辨率320×480hdpi:对应分辨率480×800...
  • Android屏幕适配之--自定义像素的缩放比例来实现屏幕适配在Android的适配中,可以采用自定义布局的形式,来通过计算像素的缩放比例来实现适配。大致思路就是,通过拿到设备实际的长宽像素值来除以参考设备的长宽值,...
  • android的bug,把编译模式从eng改成user就可以了,红框只是eng模式debug的时候提示你系统busy,红框越久说明你的系统或应用运行卡顿越久,这个时候系统可能会挂掉,仅此而已!下面详细说明一下完善方法:方法一、...
  • androidScreenShareAndControl免root兼容所有android屏幕实时共享及远程控制 beta1该版本可以兼容所有android系统,但仅限于集成了该代码的app,只支持显示activity的布局,不支持显示对话框中的内容。后续会发布...
  • Android 屏幕截图

    2021-06-07 09:34:54
    Android 屏幕截图04/08/2020本文内容如果你的 App Center 测试报表在 Android 上一致地显示了空白或打乱的屏幕截图,则通常是因为你的应用程序已禁用屏幕截图。 此 Android 设置经常用于处理敏感数据(例如财务或医疗...
  • /////////////////////////横竖屏///////////////////////////////private OrientationEventListener mOrientationListener;//screen orientation listenerprivate final void startOrientationChangeListener(){...
  • 接下来实现一个简单的Android屏幕镜像功能,主要涉及到以下这些知识点:1、Android屏幕采集2、MediaCodec编解码3、Android音频数据采集4、AudioTack播放pcm5、tcp、udp传输一、屏幕采集Android5.0及更高版本支持屏幕...
  • Android在研究Android的icon设计之前,有必要先了解Android的界面是如何适配多样化屏幕的。适配性由于同一个UI元素(如100×100像素的图片)在高精度的屏幕上要比低精度的屏幕上看起来要小,为了让这两个屏幕上的图片...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 371,583
精华内容 148,633
关键字:

安卓的屏幕