Android 显示刷新频率的实现代码

Android 显示刷新频率

android11-release

开发者选项->显示刷新频率

packages/apps/Settings/src/com/android/settings/development/ShowRefreshRatePreferenceController.java

调用 SurfaceFlinger::onTransact 中 1034 方法
updateShowRefreshRateSetting() 通过 SurfaceFlinger 获取 mRefreshRateOverlay != nullptr 判断显示是否打开
writeShowRefreshRateSetting(boolean isEnabled) 设置打开显示刷新频率

public class ShowRefreshRatePreferenceController extends DeveloperOptionsPreferenceController
        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {

    private static final String SHOW_REFRESH_RATE_KEY = "show_refresh_rate";

    private static final int SETTING_VALUE_QUERY = 2;
    private static final int SETTING_VALUE_ON = 1;
    private static final int SETTING_VALUE_OFF = 0;

    @VisibleForTesting
    static final String SURFACE_FLINGER_SERVICE_KEY = "SurfaceFlinger";
    @VisibleForTesting
    static final int SURFACE_FLINGER_CODE = 1034;

    private static final String SURFACE_COMPOSER_INTERFACE_KEY = "android.ui.ISurfaceComposer";

    private final IBinder mSurfaceFlinger;

    public ShowRefreshRatePreferenceController(Context context) {
        super(context);
        mSurfaceFlinger = ServiceManager.getService(SURFACE_FLINGER_SERVICE_KEY);
    }

    @Override
    public String getPreferenceKey() {
        return SHOW_REFRESH_RATE_KEY;
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        final boolean isEnabled = (Boolean) newValue;
        writeShowRefreshRateSetting(isEnabled);
        return true;
    }

    @Override
    public void updateState(Preference preference) {
        updateShowRefreshRateSetting();
    }

    @Override
    protected void onDeveloperOptionsSwitchDisabled() {
        super.onDeveloperOptionsSwitchDisabled();
        final SwitchPreference preference = (SwitchPreference) mPreference;
        if (preference.isChecked()) {
            // Writing false to the preference when the setting is already off will have a
            // side effect of turning on the preference that we wish to avoid
            writeShowRefreshRateSetting(false);
            preference.setChecked(false);
        }
    }

    @VisibleForTesting
    void updateShowRefreshRateSetting() {
        // magic communication with surface flinger.
        try {
            if (mSurfaceFlinger != null) {
                final Parcel data = Parcel.obtain();
                final Parcel reply = Parcel.obtain();
                data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
                data.writeInt(SETTING_VALUE_QUERY);
                mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data, reply, 0 /* flags */);
                final boolean enabled = reply.readBoolean();
                ((SwitchPreference) mPreference).setChecked(enabled);
                reply.recycle();
                data.recycle();
            }
        } catch (RemoteException ex) {
            // intentional no-op
        }
    }

    @VisibleForTesting
    void writeShowRefreshRateSetting(boolean isEnabled) {
        try {
            if (mSurfaceFlinger != null) {
                final Parcel data = Parcel.obtain();
                data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
                final int showRefreshRate = isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF;
                data.writeInt(showRefreshRate);
                mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data,
                        null /* reply */, 0 /* flags */);
                data.recycle();
            }
        } catch (RemoteException ex) {
            // intentional no-op
        }
        updateShowRefreshRateSetting();
    }
}

RefreshRateOverlay 实际Layer显示刷新频率

frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp
frameworks\native\services\surfaceflinger\RefreshRateOverlay.cpp

初始化 RefreshRateOverlay,通过 SurfaceFlinger createLayer显示

到此这篇关于Android 显示刷新频率的实现代码的文章就介绍到这了,更多相关android刷新频率内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android token过期刷新处理的方法示例

    token token的意思是"令牌",是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识).time(当前时间的时间戳).sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器).还可以把不变的参数也放进token,避免多次查库. 第一种方案 通过okhttp提供的Authenticator接口,但是只有HTTP返回码为401时才会触发.此种方式局限性很大,要求后台设计必须符合规范.在实际项目中

  • Android 使用SwipeRefreshLayout控件仿抖音做的视频下拉刷新效果

    SwipeRefreshLayout(这个控件),我先跟大家介绍一下这个控件: 一.SwipeRefreshLayout简单介绍 •先看以下官方文档,已有了很详细的描述了. 官方文档说明 •这里我再大概解释一下: •在竖直滑动时想要刷新页面可以用SwipeRefreshLayout来实现.它通过设置OnRefreshListener来监听界面的滑动从而实现刷新.也可以通过一些方法来设置SwipeRefreshLayout是否可以刷新.如:setRefreshing(true),展开刷新动画. s

  • Android获取设备CPU核数、时钟频率以及内存大小的方法

    本文实例讲述了Android获取设备CPU核数.时钟频率以及内存大小的方法.分享给大家供大家参考,具体如下: 因项目需要,分析了一下 Facebook 的开源项目 - Device Year Class. Device Year Class 的主要功能是根据 CPU核数.时钟频率 以及 内存大小 对设备进行分级.代码很简单,只包含两个类: DeviceInfo -> 获取设备参数, YearClass -> 根据参数进行分级. 下表是 Facebook 公司提供的分级标准,其中 Year 栏表

  • Android OkHttp实现全局过期token自动刷新示例

    问题 一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下. 当请求某个接口的时候,我们会在请求的header中携带token消息,但是发现token失效,接口请求报错,怎么马上刷新token,然后重复请求方才那个接口呢?这个过程应该说对用户来说是无感的. 这个过程用流程图可以这样表示: 自动更新token流程 要实现上述需求的话,大家会如何实现呢? 首先讲一下Token和Cookie吧 - cookie cookie是保存在本地终端的数据.cookie由服务器生成,发送给浏

  • android downsample降低音频采样频率代码

    使用Android AudioRecord 录制PCM文件,android SDK保证在所有设备上都支持的采样频率只有44100HZ,所以如果想得到其他采样频率的PCM数据,有几种方式:1.在设备上尝试可用的采样频率,2.使用44.1K采样后转换采样频率. 其中第二种转换采样频率的操作,有很多种方法.目前我使用的是SSRC,效果很好. 复制代码 代码如下: private void simpleDownSample() {        File BeforeDownSampleFile = n

  • Android RecyclerView的刷新分页的实现

    在开发中常常使用到刷新分页,这里实现一个 RecyclerView 的简单的刷新分页操作,测试效果见文末,实现过程参考如下: 实现思路 加载更多数据使用到 RecyclerView 加载多种布局,根据 ViewType 判断加载数据 Item 还是加载 FooterItem ; 通过线程模拟加载数据; 为 RecyclerView 添加 addOnScrollListener 事件来监听用户的滑动操作; 根据用户滑动状态以及具体情况开始加载数据 通知数据更新; 如何获得 firstVisible

  • Android 显示刷新频率的实现代码

    Android 显示刷新频率 android11-release 开发者选项->显示刷新频率 packages/apps/Settings/src/com/android/settings/development/ShowRefreshRatePreferenceController.java 调用 SurfaceFlinger::onTransact 中 1034 方法 updateShowRefreshRateSetting() 通过 SurfaceFlinger 获取 mRefreshRa

  • Android 显示和隐藏输入法实现代码

    复制代码 代码如下: // 隐藏输入法 InputMethodManager imm = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); // 显示或者隐藏输入法 imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); toggleSoftInput 这个方法可以转换软件输入法在窗体中的显示状态.

  • Android实现显示电量的控件代码

    下面介绍了Android实现显示电量的控件代码,具体代码如下: 1.目录结构,本人是使用安卓死丢丢. 2.运行界面,输入框中输入数值,点击刷新,会再电池中显示出相应的电量 3.绘制自定义电池控件,首先,新建一个类BatteryState继承View private Context mContext; private float width; private float height; private Paint mPaint; private float powerQuantity=0.5f;/

  • android显示TextView文字的倒影效果实现代码

    今天记录一下TextView的倒影效果,显示一串文字,然后在文字的下方显示出它的倒影,先上效果图: 最重要的就是View中getDrawingCache()方法,该方法可以获取cache中的图像,然后绘制出来. 废话不多说,我是想写一个带有倒影的时间,时间可以走动.首先先写一个带有时间走动的View,这个很简单,获取当前时间,然后开启一个线程,隔一秒获取当前时间一次,然后显示在TextView上,当然,我们写控件,就需要继承TextView,代码如下: 复制代码 代码如下: package co

  • Android中显示GIF动画的实现代码

    本文实例讲述了Android中显示GIF动画的实现代码.分享给大家供大家参考,具体如下: gif图动画在android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示代码,我下载过几个,但是都不是很理想,不是我完全想要的.所以有时候就得自己学会总结,把开源的东西整理成自己的,现在无聊,也正好有朋友需要,所以现在整理了一下,留着以后备用! 废话不多说,直接上图: 在这里主要用

  • Android 模拟新闻APP显示界面滑动优化实例代码

    内容: 1.滑动优化(滑动时不加载图片,停止才加载) 2.第一次进入时手动加载 代码如下: 1.界面布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:

  • Android View刷新机制实例分析

    本文实例讲述了Android View刷新机制.分享给大家供大家参考,具体如下: 一.总体说明 在Android的布局体系中,父View负责刷新.布局显示子View:而当子View需要刷新时,则是通知父View来完成. 二.代码分析 1).ViewGroup的addView方法,理解参数的意义和传递 invalidate调用父类View的方法 addViewInner方法主要做的事情是 view的dispatchAttachedToWindow(AttachInfo info, int visi

  • Android栗子の图片验证码生成实例代码

    废话不多说了,下面一段代码给大家分享android 生成栗子图片验证码功能,具体代码如下所示: import java.util.Random; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; public class

  • Android实现面包屑功能的代码(支持Fragment联动)

    由于UI小姐姐给的设计图中包含了面包屑效果,去github逛了一圈,没有特别合适的,只能自己实现了. 先看下效果图: 先看下逐个添加Fragment,然后按返回键挨个回退的场景: 接着看下逐个添加Fragment,直接点击选择tab的场景: demo地址 BreadCrumbsView 使用方式 1.布局中引入BreadCrumbsView <com.tinytongtong.breadcrumbs.BreadCrumbsView android:id="@+id/breadCrumbs&

  • Android显示系统SurfaceFlinger分析

    目录 一 Surfaceflinger介绍 二 bufferqueue 原理 三 surfaceflinger 关系图 四 layer显示内存分配 五 surfaceflinger Layer 一 Surfaceflinger介绍 surfaceflinger作用是接受多个来源的图形显示数据,将他们合成,然后发送到显示设备.比如打开应用,常见的有三层显示,顶部的statusbar底部或者侧面的导航栏以及应用的界面,每个层是单独更新和渲染,这些界面都是有surfaceflinger合成一个刷新到硬

随机推荐