Android开发sensor旋转屏问题解决示例

目录
  • 一、查询 activity xml 配置screenOrientation信息:
  • 二、事件发生时间点分析:
  • 三、logcat查看sensor激活状态:
    • 状态栏--控制按钮--“方向锁定” 开启时,en=0 即 sensor关闭!
  • 四、查看APP是否注册旋转屏sensor
  • 五、sensorservice 信息
    • bugreport dumpsys sensorservice信息查看 注册的sensor信息
    • 相关sensor:
    • bugreport device_orient 信息查看上报事件
  • 六、有现场,查看当前activity信息
    • logcat查看当前activity: 有很多其他日志可供查看
    • 根据DUMP OF SERVICE usagestats:内容 查看时间点的APP
    • 现场,命令方式查询当前activity:
    • 查看包信息
    • 查看apk内部 AndroidManifest.xml
  • 七、App写旋转屏的几种方式:
  • 八、bugreport 中 mUserRotation 信息
  • 九、setting信息查询 没大用,只能查当前信息
  • 十、用户点击状态栏“锁定旋转”行为分析:
  • 十一、app调用 setRequestedOrientation 请求变更activity方向配置
    • X、一些知识点:

一、查询 activity xml 配置screenOrientation信息:

找个测试机器,安装此APP。as中 devices explorer界面中打开此apk安装目录,双击apk。或者把apk托到as中,在反编译的资产xml文件搜索此activity,并查看 android:screenOrientation 属性。或者使用 aapt dump xmltree 命令查看。

configChanges 属性是为了防止重启activity

  <activity
            android:theme="@ref/0x7f130170"
            android:label="@ref/0x7f1200c6"
            android:name="com.miui.gallery.activity.ExternalPhotoPageActivity"
            android:screenOrientation="4"
            android:configChanges="0xda0"
            android:showWhenLocked="true">

二、事件发生时间点分析:

事件发生时间点=录屏文件名的时间 + 录屏发生时视频经过的秒数

结合问题描述和usagestats服务的信息倒推事件发生时间点

三、logcat查看sensor激活状态:

此log是高通 sensors-hal 层打印的

状态栏--控制按钮--“方向锁定” 开启时,en=0 即 sensor关闭!

/vendor/qcom/proprietary/sensors-see/sensors-hal-2.0/framework/sensors_hal.cpp

logcat中搜索 device_orientation

2021-08-09 17:07:23.037 1021-1021/? I/sensors-hal: activate:209, android.sensor.device_orientation/272 en=1
2021-08-09 17:07:23.048 1021-1021/? I/sensors-hal: activate:220, android.sensor.device_orientation/272 en=1 completed

四、查看APP是否注册旋转屏sensor

有的APP注册的是加速度sensor,使用自己的算法计算

APP注册 android.view.OrientationEventListener 回调,自身代码调节旋转Demo:

    private void registerOrientation(){
        OrientationEventListener orientationListener = new OrientationEventListener(this) {
            @Override
            public void onOrientationChanged(int orientation) {
                Log.d(TAG, "onOrientationChanged: " + orientation);
                if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
                    return; // 手机平放时,检测不到有效的角度
                }
                // 设置竖屏
                if (((orientation >= 0) && (orientation <= 30)) || (orientation >= 330)) {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                }
                // 设置横屏
                else if (((orientation >= 230) && (orientation <= 310))) {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                }
            }
        };
        orientationListener.enable();
    }

五、sensorservice 信息

DUMP OF SERVICE CRITICAL sensorservice:

bugreport dumpsys sensorservice信息查看 注册的sensor信息

Previous Registrations:
17:57:12 + 0x0000002d pid=20420 uid=10265 package=android.view.OrientationEventListener samplingPeriod=200000us batchingPeriod=0us
17:57:12 + 0x0000002d pid=20420 uid=10265 package=android.view.OrientationEventListener samplingPeriod=200000us batchingPeriod=0us

相关sensor:

// 加速计传感器	handle: 0x0100000b
// app通常会注册回调 android.view.OrientationEventListener 此类内部注册了 加速计sensor,用来监听旋转角度
// android.sensor.accelerometer
public static final int TYPE_ACCELEROMETER = 1;
0x0100000b) lsm6dso Accelerometer Non-wakeup | STMicro         | ver: 142870 | type: android.sensor.accelerometer(1) | perm: n/a | flags: 0x00000980
	continuous | minRate=1.00Hz | maxRate=415.97Hz | FIFO (max,reserved) = (10000, 3000) events | non-wakeUp |
	highest rate level = 3, support shared mem: gralloc,
0x0100015f) lsm6dso Accelerometer-Uncalibrated Non-wakeup | STMicro         | ver: 142870 | type: android.sensor.accelerometer_uncalibrated(35) | perm: n/a | flags: 0x00000980
	continuous | minRate=1.00Hz | maxRate=415.97Hz | FIFO (max,reserved) = (10000, 3000) events | non-wakeUp |
	highest rate level = 3, support shared mem: gralloc,
0x5f676273) Gyroscope Bias (debug)    | AOSP            | ver: 1 | type: android.sensor.accelerometer(1) | perm: n/a | flags: 0x00000000
	continuous | maxDelay=0us | maxRate=415.97Hz | no batching | non-wakeUp |
// 方向传感器---用户app旋转屏   handle:	0x0100010f
// android.sensor.device_orientation
public static final int TYPE_DEVICE_ORIENTATION = 27;
0x0100010f) device_orient  Non-wakeup | xiaomi          | ver: 1 | type: android.sensor.device_orientation(27) | perm: n/a | flags: 0x00000002
	on-change | maxDelay=0us | minDelay=0us | FIFO (max,reserved) = (10000, 0) events | non-wakeUp |
// 其 Wakeup handle:  0x01000110   com.android.server.policy.WindowOrientationListener 注册此类型
0x01000110) device_orient  Wakeup     | xiaomi          | ver: 1 | type: android.sensor.device_orientation(27) | perm: n/a | flags: 0x00000003
	on-change | maxDelay=0us | minDelay=0us | FIFO (max,reserved) = (10000, 0) events | wakeUp |

bugreport device_orient 信息查看上报事件

# 0 表示通常的正常
# 1 表示顺时针旋转90度
device_orient  Wakeup: last 10 events
	 1 (ts=68477.447943014, wall=17:49:58.724) 0.00,
	 2 (ts=68478.554363222, wall=17:49:59.831) 0.00,
	 3 (ts=68478.989033691, wall=17:50:00.265) 0.00,
	 4 (ts=68479.423711660, wall=17:50:00.701) 1.00,
	 5 (ts=68482.743111608, wall=17:50:04.022) 0.00,
	 6 (ts=68486.101931400, wall=17:50:07.379) 0.00,
	 7 (ts=68495.309003118, wall=17:50:16.585) 0.00,
	 8 (ts=68505.308247806, wall=17:50:26.584) 1.00,
	 9 (ts=68507.166153170, wall=17:50:28.444) 0.00,
	10 (ts=68513.214244108, wall=17:50:34.491) 0.00,

六、有现场,查看当前activity信息

logcat查看当前activity: 有很多其他日志可供查看

07-31 17:50:25.687563  4486  4486 D Nav_RecentsImpl: onResumed className=com.miui.gallery.activity.ExternalPhotoPageActivity,mIsInAnotherPro=false,isKeyguardLocked=false,mNavStubView=com.miui.home.recents.NavStubView{f994da4 G.E...... ......I. 0,0-1080,35}

根据DUMP OF SERVICE usagestats:内容 查看时间点的APP

    time="2021-07-08 09:29:02" type=ACTIVITY_PAUSED package=com.ainemo.dragoon class=com.meeting.call.activity.XylinkMeetingActivity instanceId=40437940 taskRootPackage=com.ainemo.dragoon taskRootClass=com.ainemo.android.activity.MainActivity flags=0x0
log的结尾:
  In-memory daily stats
  timeRange="2021/8/21 08:14–18:08"
    packages

现场,命令方式查询当前activity:

adb shell dumpsys window | findstr mCurrentFocus
dumpsys window | grep  mCurrentFocus

查看包信息

adb shell dumpsys package com.eg.android.AlipayGphone
$ adb shell dumpsys package com.android.stk
Packages:
  Package [com.android.stk] (ac39f18):
    userId=1001
    sharedUser=SharedUserSetting{411f5ce android.uid.phone/1001}
    pkg=Package{fde9cef com.android.stk}
    codePath=/system/app/Stk
    resourcePath=/system/app/Stk      # apk 安装包位置
    legacyNativeLibraryDir=/system/app/Stk/lib
    extractNativeLibs=true
    primaryCpuAbi=null
    secondaryCpuAbi=null
    cpuAbiOverride=null
    versionCode=31 minSdk=31 targetSdk=31
    minExtensionVersions=[]
    versionName=12                    # 版本号
    usesNonSdkApi=true
    splits=[base]
    apkSigningVersion=3
    applicationInfo=PackageImpl{fde9cef com.android.stk}
    flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
    privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ALLOW_AUDIO_PLAYBACK_CAPTURE DEFAULT_TO_DEVICE_PROTECTED_STORAGE DIRECT_BOOT_AWARE PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING ]
    forceQueryable=false
    queriesPackages=[]
    dataDir=/data/user_de/0/com.android.stk  # 数据目录
    supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity] ############
    timeStamp=2009-01-01 08:00:00
    firstInstallTime=2009-01-01 08:00:00    # 首次安装时间
    lastUpdateTime=2009-01-01 08:00:00      # 上次更新时间
    signatures=PackageSignatures{573d3fc version:3, signatures:[b4addb29], past signatures:[]}
    installPermissionsFixed=false
    pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]

查看apk内部 AndroidManifest.xml

aapt dump xmltree C:\Users\lish\Desktop\test.apk AndroidManifest.xml

七、App写旋转屏的几种方式:

三种方式做旋转屏:

大部分都是直接使用系统控制的,就是SystemServer进程注册的 com.android.server.policy.WindowOrientationListener 监听,然后直接控制APP的界面旋转,这个使用的 device_orient sensor。 但是因手机不同,厂商不同,有些竖直反向的旋转,系统不准旋转。

// frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java
// 内部类: DisplayRotation.OrientationListener
private class OrientationListener extends WindowOrientationListener
//  在systemserver进程中是通过 com.android.server.wm.DisplayRotation$OrientationListener 操作
  • 因此,大部分视频app又会独立注册 android.view.OrientationEventListener 监听,这个监听直接使用的加速度sensor(android.sensor.accelerometer) 这个sensor直接返回0~360度的角度。然后APP根据角度,自己控制旋转。此时“方向锁定”不起作用。
  • app直接使用 地磁+加速度 传感器

八、bugreport 中 mUserRotation 信息

adb shell dumpsys window displays

dumpsys window displays | grep DisplayRotation -A 30

文件中搜索 mUserRotation=

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
  DisplayRotation
    mCurrentAppOrientation=SCREEN_ORIENTATION_PORTRAIT
    mLastOrientation=1
    mRotation=0 mDeferredRotationPauseCount=0
    mLandscapeRotation=ROTATION_90 mSeascapeRotation=ROTATION_270
    mPortraitRotation=ROTATION_0 mUpsideDownRotation=ROTATION_180
    mSupportAutoRotation=true
    WindowOrientationListener
      mEnabled=false
      mCurrentRotation=ROTATION_0
      mSensorType=null
      mSensor={Sensor name="device_orient  Wakeup", vendor="xiaomi", version=1, type=27, maxRange=1.0, resolution=1.0, power=0.001, minDelay=0}
      mRate=2
      OrientationSensorJudge
        mDesiredRotation=-1
        mProposedRotation=-1
        mTouching=false   # 触摸屏幕情况下,不调用 DisplayRotation.java$OrientationListener 中的 onProposedRotationChanged 方法。即不会旋转
        mTouchEndedTimestampNanos=617520702367  # 抬起手时,机器开机以来的时间  如果当前时间
    mCarDockRotation=-1 mDeskDockRotation=-1
    mUserRotationMode=USER_ROTATION_LOCKED mUserRotation=ROTATION_90 mAllowAllRotations=false  # 正常 mUserRotationMode=USER_ROTATION_LOCKED mUserRotation=ROTATION_0
    mDemoHdmiRotation=ROTATION_90 mDemoHdmiRotationLock=false mUndockedHdmiRotation=-1
    mLidOpenRotation=-1
    mFixedToUserRotation=false

九、setting信息查询 没大用,只能查当前信息

D:\&gt;adb shell  "dumpsys settings | grep rotation"
_id:109 name:user_rotation pkg:android value:0 default:0 defaultSystemSet:true
_id:17 name:accelerometer_rotation pkg:android value:0 default:0 defaultSystemSet:true
# /frameworks/base/core/java/android/provider/Settings.java   ACCELEROMETER_ROTATION
# 0 表示 加速度sensor 不会用于控制屏幕方向, 1 反之.
_id:108 name:hide_rotation_lock_toggle_for_accessibility pkg:com.android.systemui value:0 default:0 defaultSystemSet:true

bugreport 中:

DUMP OF SERVICE settings:

十、用户点击状态栏“锁定旋转”行为分析:

  • bugreport 搜索 DeviceStateMonitor:

分析用户旋转屏时间点

      ++++++++++++++++++++++++++++++++
      DeviceStateMonitor:
        mIsTetheringOn=false
        mIsScreenOn=true
        mIsCharging=false
        mIsPowerSaveOn=false
        mIsLowDataExpected=false
        mIsCarModeOn=false
        mUnsolicitedResponseFilter=127
        mIsWifiConnected=true
        mIsAlwaysSignalStrengthReportingEnabled=false
        Local logs:
          2021-08-22T13:15:02.576 - Screen on for display=Display id 0: DisplayInfo{"内置屏幕", displayId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1080 x 2400, largest app 2320 x 2276, smallest app 1080 x 956, appVsyncOff 1000000, presDeadline 13333332, mode 3, defaultMode 1, modes [{id=1, width=1080, height=2400, fps=60.000004}, {id=2, width=1080, height=2400, fps=144.00002}, {id=3, width=1080, height=2400, fps=120.00001}, {id=4, width=1080, height=2400, fps=90.0}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[2, 3, 4], mMaxLuminance=420.0, mMaxAverageLuminance=210.1615, mMinLuminance=0.323}, minimalPostProcessingSupported false, rotation 0, state ON}, DisplayMetrics{density=2.75, width=1080, height=2276, scaledDensity=2.75, xdpi=394.705, ydpi=394.307}, isValid=true
          2021-08-22T13:15:03.023 - Screen on for display=Display id 0: DisplayInfo{"内置屏幕", displayId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1080 x 2400, largest app 2320 x 2276, smallest app 1080 x 956, appVsyncOff 1000000, presDeadline 13333332, mode 3, defaultMode 1, modes [{id=1, width=1080, height=2400, fps=60.000004}, {id=2, width=1080, height=2400, fps=144.00002}, {id=3, width=1080, height=2400, fps=120.00001}, {id=4, width=1080, height=2400, fps=90.0}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[2, 3, 4], mMaxLuminance=420.0, mMaxAverageLuminance=210.1615, mMinLuminance=0.323}, minimalPostProcessingSupported false, rotation 0, state ON}, DisplayMetrics{density=2.75, width=1080, height=2276, scaledDensity=2.75, xdpi=394.705, ydpi=394.307}, isValid=true
          2021-08-22T13:15:42.385 - Wifi (default) connected
          ...............
      ++++++++++++++++++++++++++++++++
      TransportManager:
  • bugreport 搜索 BUFFER QSLog:
  • 分析 用户点击 “方向锁定” 时间点
  • 现场执行命令: dumpsys activity service com.android.systemui/.dump.SystemUIAuxiliaryDumpService
    BUFFER QSLog:
    ============================================================================
    12-22 14:48:42.160 V QSLog: [custom(com.miui.securitycenter/com.miui.superpower.notification.SuperPowerTileService)] Tile updated. Label=超级省电. State=1. Icon=null.
    12-22 14:48:42.160 V QSLog: [custom(com.milink.service/com.milink.ui.service.MiLinkTileService)] Tile updated. Label=投屏. State=1. Icon=null.
    12-22 14:48:42.160 V QSLog: [custom(com.miui.mishare.connectivity/.tile.MiShareTileService)] Tile updated. Label=小米互传. State=1. Icon=null.
    12-22 16:50:34.787 VERBOSE QSLog [rotation] Tile updated. Label=方向锁定. State=2. Icon=ResourceIcon[resId=0x7f0805a0].
    12-22 16:51:07.775 DEBUG QSLog [rotation] Tile clicked. StatusBarState=SHD. TileState=active
    12-22 16:51:07.790 VERBOSE QSLog [rotation] Tile updated. Label=方向锁定. State=1. Icon=ResourceIcon[resId=0x7f0805a1].
  • Label=方向锁定. State=2 表示 锁定
  • logcat 搜索 “ send click msg ” 状态栏点击事件
  • android_util_SeempLog.cpp 这个高通的log似乎未起作用

十一、app调用 setRequestedOrientation 请求变更activity方向配置

需要自己写打点log

X、一些知识点:

亮屏是否默认开启旋转屏sensor: 锁定旋转后,device_orient 这个sensor是否一直处于 enable状态,google 默认开启

/frameworks/base/core/java/android/provider/Settings.java

        /**
         * The default state of SHOW_ROTATION_SUGGESTIONS.
         * @hide
         */
        public static final int SHOW_ROTATION_SUGGESTIONS_DEFAULT =
                // SHOW_ROTATION_SUGGESTIONS_ENABLED;
                SHOW_ROTATION_SUGGESTIONS_DISABLED;

以上就是Android开发sensor旋转屏问题解决示例的详细内容,更多关于Android sensor旋转屏的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android性能优化getResources()与Binder导致界面卡顿优化

    目录 背景 观测 1. trace体现UI绘制操作严重耗时 2. 排查measure和layout慢的原因:可疑的多次binder 3. binder:在哪.谁为.为何频繁调用 4. binder:频繁调用的具体定位 结论 方案 背景 某轮测试发现,我们的设备运行一个第三方的App时,卡顿感非常明显: 界面加载很慢,菊花转半天 滑屏极度不跟手,目测观感帧率低于15 对比机(竞品)也会稍微一点卡,但是好很多,基本不会有很大感觉的卡顿 可以初步判定我们的设备存在性能问题,亟需优化,拉平到竞品水准.

  • Android对so进行简单hook思路解析

    目录 1.什么是Hook 2.对App的so进行Hook的一种思路 3.一个最基本的JNI sample程序代表目标宿主Apk 4.开始Hook 4.1.编写Hook代码 1.什么是Hook Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递.简单来说,就是把系统的程序拉出来变成我们自己执行代码片段. 2.对App的so进行Hook的一种思路 我们知道现在JNI在And

  • Android Studio gradle配置packagingOptions打包so库重复

    目录 正文 pickFirst 匹配 doNotStrip 设置 merge 将匹配的文件都添加到APK中 exclude 过滤 正文 在安卓开发中,通常会使用到gradle来编译,在安卓项目的app目录下的build.gradle中是用来对编译进行配置的,packagingOptions 是其中的一个打包配置,常见的设置项有exclude.pickFirst.doNotStrip.merge. 在日常代码开发中,我们需要知其然,而知其所以然,本文章知识也是Android日常瘦身的的必备知识.

  • Android进程间大数据通信LocalSocket详解

    目录 前言 服务端初始化 客户端初始化 数据传输 发送数据 接收数据 传输复杂数据 写数据 读数据 传输超大数据 写入 读取 前言 说起Android进行间通信,大家第一时间会想到AIDL,但是由于Binder机制的限制,AIDL无法传输超大数据. 那么我们如何在进程间传输大数据呢? Android中给我们提供了另外一个机制:LocalSocket 它会在本地创建一个socket通道来进行数据传输. 那么它怎么使用? 首先我们需要两个应用:客户端和服务端 服务端初始化 override fun

  • Android NDK 开发中 SO 包大小压缩方法详解

    目录 背景 1.STL的使用方式 2.不使用Exception和RTTI RTTI Exception 3.使用 gc-sections去除没有用到的函数 4.去除冗余代码 5.设置编译器的优化flag 6.设置编译器的 Visibility Feature 7.设置编译器的Strip选项 8.去除C++代码中的iostream相关代码 总结 背景 这周在做Yoga包的压缩工作.Yoga本身是用BUCK脚本编译的,而最终编译出几个包大小大总共约为7M,不能满足项目中对于APK大小的限制,因此需要

  • RxJava入门指南及其在Android开发中的使用示例

    RxJava的GitHub主页,部署部分就没什么好说的了~ https://github.com/ReactiveX/RxJava 基础 RxJava最核心的两个东西是Observables(被观察者,事件源)和Subscribers(观察者).Observables发出一系列事件,Subscribers处理这些事件.这里的事件可以是任何你感兴趣的东西(触摸事件,web接口调用返回的数据...) 一个Observable可以发出零个或者多个事件,知道结束或者出错.每发出一个事件,就会调用它的Su

  • Android开发中GridView用法示例

    本文实例讲述了Android开发中GridView用法.分享给大家供大家参考,具体如下: Android的GridView控件用于把一系列的空间组织成一个二维的网格显示出来,应用的比较多的就是组合图片显示.下面我就详细讲一个例子. 首先写一个类继承BaseAdapter 1. Java代码 package com.yarin.android.Examples_04_19; import android.content.Context; import android.view.View; impo

  • Android开发之开关按钮用法示例

    本文实例讲述了Android开发之开关按钮用法.分享给大家供大家参考,具体如下: 效果如下: 以下是布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_

  • android开发权限询问的示例代码

    现在基于信息安全问题,特别是版本是23以上权限越严格. 特别是拍照,读,写权限 一般权限允许过,下次就不用询问了的,所以很多应用都喜欢在首页或者启动页直接询问,不允许的就用不了1.下面给出封装好的类,至于什么时候调看项目需要 public class EasyPermissions { private static final String TAG = "EasyPermissions"; public interface PermissionCallbacks extends Act

  • Android开发中ProgressDialog简单用法示例

    本文实例讲述了Android开发中ProgressDialog简单用法.分享给大家供大家参考,具体如下: 网上一般对进度条的示例都是如何显示,没有在任务结束如何关闭的文章,参考其他文章经过试验之后把整套进度条显示的简单示例如下: 建立android工程等工作都略去,Google一下就可以了. 下面来介绍主要的Activity ProgressBarDemo.java package com.lveyo.android.demo.progressbar; import android.app.Ac

  • Android开发之弹出软键盘工具类简单示例

    本文实例讲述了Android开发之弹出软键盘工具类.分享给大家供大家参考,具体如下: package com.maobang.imsdk.util; import android.content.Context; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import java.util.Timer; import java.util.TimerTask; /** * 让

  • Android开发之瀑布流控件的实现与使用方法示例

    本文实例讲述了Android开发之瀑布流控件的实现与使用方法.分享给大家供大家参考,具体如下: public class FlowLayout extends ViewGroup { /**行里子view之间的行距离*/ public int mHorizontolSpace = Util.getDimen(R.dimen.top_padding); /**行里子view之间的垂直距离*/ public int mVerticalSpace = Util.getDimen(R.dimen.top

  • Android开发使用Drawable绘制圆角与圆形图案功能示例

    本文实例讲述了Android开发使用Drawable绘制圆角与圆形图案功能.分享给大家供大家参考,具体如下: 1. 创建类RoundCircleDrawable继承Drawable /** * 圆角矩形 * @Project App_View * @Package com.android.view.drawable * @author chenlin * @version 1.0 * @Date 2016年4月21日 * @Note TODO */ public class RoundCircl

  • Android开发中自定义ProgressBar控件的方法示例

    本文实例讲述了Android开发中自定义ProgressBar控件的方法.分享给大家供大家参考,具体如下: 很简单,首先加载Drawable,在onMeasure设置好其区域大小, 然后使用canvas.clipRect绘图 public class ProgressView extends ImageView { private Drawable maskDraw; /** * 加载的进度 0-100 */ private int mProcess = 20; public ProgressV

  • Android开发之底图局部加载移动的方法示例

    本文实例讲述了Android开发之底图局部加载移动的方法.分享给大家供大家参考,具体如下: public class MapMgr { public static MapMgr mapMgr = null; private int map_num = 28; private int b_x = 0; private int b_y = 0; private int width = 0; private int height = 0; private Bitmap bmpView = null;

随机推荐