小编Boo*_*unz的帖子

控制主题背景的长宽比(Android)

我已经为我的应用程序设置了一个加载屏幕(启动),通过一些建议解释了"正确的方法":

styles.xml:

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_vector_drawable</item>
</style>
Run Code Online (Sandbox Code Playgroud)

表现:

<activity
        android:name="com.tba.versionc.SplashActivity"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
Run Code Online (Sandbox Code Playgroud)

Java的:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我为启动画面设计矢量drawable时,我设置它的宽高比以匹配我的手机(16:9),它似乎工作正常,但我担心在设备上运行时会出现的宽高比会发生什么屏幕比例不同.

为了消除它"伸展以适应"错误尺寸屏幕的可能性,我宁愿它是中心裁剪,但由于它不是ImageView,甚至是布局文件的一部分,我不知道有什么办法设置中心裁剪属性.

任何人?

screen splash-screen aspect-ratio drawable

7
推荐指数
1
解决办法
2075
查看次数

奇怪的UITextField毛刺/错误:当删除居中文本时,光标向左跳转

当我在一个空的UITextField中按下删除键时,我发生了一个奇怪的故障.

我应该无法删除任何内容,但是当我点击删除时,光标会向文本字段中的标签宽度移动到左边,它是空的.

这只发生在文本字段居中的文本中,而不是左对齐时.

当我恢复键入时,它会跳回中心并且行为正常.

知道会发生什么吗?

uitextfield ios

6
推荐指数
1
解决办法
200
查看次数

如何使用 Android Profiler 在 Android 中查找不需要的引用

我正在努力更好地寻找 Android 中的内存泄漏。

我发现了 Android Profiler 并学习了如何执行堆转储以及如何确定内存中给定对象的实例是否过多。

我已经读过,找到一个不需要的对象为什么仍然存在的根源的方法之一是突出显示它并“查看哪些对象仍然持有对它的引用并追溯到原始原因。”

所以...在此屏幕截图中,您可以看到不良情况:我有三个 MainActivity 实例...并且所有三个实例在“深度”列中都有一个数字,表明它们确实是泄漏。

如果有问题的对象是我自己创建的一个类,那么这个过程会更直接,但由于我们在这里处理的是一个实际的 Activity,当我突出显示这三个中的任何一个时,有一个大量的列表引用它的对象(列表远远超出屏幕截图)。

当然,其中大部分都是正常/良性参考——我该如何判断哪些值得研究?

有什么线索?是“ this$0 ”吗?还是保留列中的海量数字?与相关对象匹配的深度数字?我只是在猜测这一点。

当然,我不希望自己仔细阅读整个列表,“不......不可能是那个......这是Android Framework X,Y和Z的正常部分......”

在此处输入图片说明

android memory-leaks android-profiler

6
推荐指数
1
解决办法
829
查看次数

CustomPainter.shouldRepaint() 在 Flutter 中如何工作?

在 Flutter 中,创建CustomPainter时,有一个重写方法,shouldRepaint(),您可以返回 true 或 false...大概是为了告诉系统是否重新绘制视图。

\n

在文档中,该方法的描述是:

\n
\n

shouldRepaint(covariant CustomPainter oldDelegate) \xe2\x86\x92 bool 每当向 RenderCustomPaint 对象提供\n自定义绘制委托类的新实例时\n或在使用该对象的新实例创建新的\nCustomPaint 对象时调用\n自定义\npainter委托类(这相当于同一件事,因为后者是根据前者实现的)。[...]

\n
\n

除了它返回一个布尔值之外,我基本上不明白任何其他内容。这让我很头疼!我还怀疑深入研究“自定义画家委托类”或“RenderCustomPaint 对象”的定义不会是一种启发性的体验。

\n

我很困惑,因为:

\n
    \n
  • 我认为我们不必担心小部件何时“应该重新绘制”,因为 Flutter 应该根据其自身复杂的优化决策来决定何时何地重新渲染小部件树。

    \n
  • \n
  • 我认为 Paint() 方法是您定义“这就是该视图如何绘制自身的方式,(无论何时何地有必要)”的地方

    \n
  • \n
  • 我发现的所有示例都只是从该方法返回 false...但我注意到使用 true 与 false 时的不同行为。

    \n
  • \n
  • 如果我们总是返回 false,那么它如何重新绘制呢?(即使是假的,它也会重新绘制)

    \n
  • \n
  • 如果我们唯一可用的逻辑是将“oldDelegate”与(某物?)进行比较,那么为什么我们需要重写该方法呢?

    \n
  • \n
  • 我还没有看到任何示例来演示为什么或如何返回 TRUE,以及为了做出该决定而这样的示例的逻辑是什么样的。

    \n
  • \n
\n

一个有知识的人为什么以及如何决定返回 false?

\n

一个有知识的人为什么以及如何决定回归真实?

\n

谁能像你在和一个 13 岁的孩子(不是 Linus Torvalds)说话一样解释它?

\n

一个简单的代码示例和反例会很棒(而不是详尽的明确解释!)

\n

custom-view flutter flutter-custompainter flutter-custompaint

6
推荐指数
1
解决办法
1892
查看次数

无法控制共享首选项中的字符串集的顺序

这是我的第一个stackoverflow问题.我在这上面做了很多谷歌搜索.在Hashsets,Treesets,LinkedHashSets,Collections,Stacks(Stack类被弃用?)......我意识到我可以使用SQLite,但我暂时试图避免这种情况.

我正在使用Android Studio中的应用程序.该应用与人打交道,列出并以不同方式与他们联系.应用用户可以维护和控制三种类型的列表:最近联系,阻止和收藏.这些列表在共享首选项中保存为字符串集,因此它们可以在应用程序关闭和重新打开后继续存在.当使用在线数据库填充列表时,各个字符串充当主键.我最关心的是"最近联系的"列表,因为这个列表的顺序很重要.

问题是,据我所知,当我声明一个字符串集时,它如下:

Set<String> faveArray = new LinkedHashSet<String>;
Run Code Online (Sandbox Code Playgroud)

据我所知,我只能在右侧使用HashSet,LinkedHashSet或TreeSet.

因为我使用了LinkedHashset,所以当我重新打开应用程序并从共享偏好中拉出数据时,我会期望从最近添加的(LIFO /堆栈)开始拉出字符串,因此当我填充listview时,他们将与列表顶部的"最近联系"人员展示等等......或者至少我期待有某种可预测的顺序/行为,我可以使用.

所以.......我已经为我的共享首选项I/O类附加了我的代码.

从我的主应用程序,我做了类似的事情:

static SharedPrefUTIL sharedPrefUTIL;

sharedPrefUTIL = new SharedPrefUTIL(this);

sharedPrefUTIL.addRecent("derp");
sharedPrefUTIL.addRecent("nerp");
sharedPrefUTIL.addRecent("gerp");
sharedPrefUTIL.addRecent("herp");
Run Code Online (Sandbox Code Playgroud)

此时,代码

Log.i(TAG, set + " committed to " + key);
Run Code Online (Sandbox Code Playgroud)

在类SharedPrefUTIL日志的commit()方法中:

"[derp,nerp,gerp,herp]致力于最近的阵营"

关闭并重新打开应用程序后,如果我们执行:

sharedPrefUTIL.toastContents("R");
Run Code Online (Sandbox Code Playgroud)

结果似乎是随机顺序.<<<<这是我的问题.

任何帮助非常感谢.

package com.secretsoft.booberbunz;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.widget.Toast;

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Queue;
import java.util.Set;
import java.util.TreeSet;

/**
* Created by Programming on 2/22/2016.
*/
public class SharedPrefUTIL {

protected static final String TAG …
Run Code Online (Sandbox Code Playgroud)

java android shared preferences lifo

5
推荐指数
1
解决办法
2469
查看次数

Android AudioTrack.onPlaybackPositionUpdateListener并非总是按时触发

我注意到,AudioTrack.setPlaybackPositionUpdateListener()有时似乎无法按预期工作(至少在API 19-22中的Android Studio模拟器中)。

我制作了一个小测试程序,该程序带有一个按钮,当按下该按钮时,它会开始向AudioTrack提供一秒钟长的音频缓冲区。

音轨应该使用onPeriodicNotification()进行回调,这又会翻转Activity的背景颜色并生成Log。

预期行为:

按下开始按钮后,大约每隔一秒钟发送或接收一次通知。

多数时间确实会发生这种情况,但有时(似乎主要在API 19-22上):

第一个(一秒钟后)通知丢失/推迟了,相反,我们在两秒钟时收到了两个同时发生的通知。

为什么会这样呢?是否有更好的方法根据播放头的位置获取回调?

我能想到的唯一原因可能是该视频 19:30标记附近所述的CPU频率缩放问题。

主要活动:

public class MainActivity extends Activity {

    View rootView;
    Button startButton;
    int initialBackgroundColor;
    boolean colorFlipper = false;
    boolean isPlaying = false;

    // AUDIO -------------
    AudioTrack audioTrack;
    int sampleRateInHz = 44100;
    int bufferSizeInBytes = 44100;
    byte[] silenceArray;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rootView = findViewById(R.id.rootView);
        startButton = findViewById(R.id.startButton);
        initialBackgroundColor = rootView.getDrawingCacheBackgroundColor();

        // AUDIO -------------
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, …
Run Code Online (Sandbox Code Playgroud)

audio multithreading android callback audiotrack

5
推荐指数
0
解决办法
228
查看次数

在IOS 10.0或更高版本上本地化Emoji的阅读

我注意到一个问题,IOS似乎没有本地化表情符号的阅读(通过AVSpeechSynthesizer)在IOS 10.0或更高,但它确实似乎正确地做到这一点的IOS 9.3或更低。

如果您通过将字符串“”发送给设置为英语的AVSpeechSynthesizer来说出表情符号,它会说“用正常的眼睛咧嘴笑脸”。

当您将合成器的语音语言更改为英语以外的其他语言(例如法语)并发送相同的表情符号时,它应该说“ Visage souriant avec des yeux normaux”,这在IOS 9.3或更低版本上是这样,但是在IOS 10.0或更高版本上,它仅读取带有法语口音的英语文本(“普通眼睛咧着嘴笑脸”)。

我在下面构想出一个“操场”,该操场展示了我如何得出这一结论……尽管我希望我错过了某些事情或做错了什么。

要重现此问题,请在XCode中创建新项目,然后将一个按钮附加到speakNext()函数。

在运行IOS 9.3或更低版本的模拟器上运行,然后在IOS 10.0或更高版本上执行相同的操作。

您能解释一下zat吗?

import UIKit
import AVKit

class ViewController: UIViewController {

    var counter = 0

    let langArray = ["en","fr","de","ru","zh-Hans"]

    let synth = AVSpeechSynthesizer()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func speakNext(_ sender: Any) {
        print("testing \(langArray[counter])")
        let utterance = AVSpeechUtterance(string: "")
        utterance.voice = AVSpeechSynthesisVoice(language: langArray[counter])
        counter += 1
        if (counter > …
Run Code Online (Sandbox Code Playgroud)

localization text-to-speech emoji avspeechsynthesizer swift

5
推荐指数
1
解决办法
250
查看次数

如何停止 DartPad 中的程序?

使用DartPad,如何停止当前程序而不丢失所有代码?

事实上,似乎只有:

  • 一个运行按钮
  • 一个重置按钮(擦除您的代码)

答案不是:

  • “让它继续运行,然后再次单击“运行”,”

(因为显然它不会首先停止当前代码,实际上会并行开始后续运行!***)

  • “只需重新加载浏览器选项卡”

(因为如果你需要读取快速变化的控制台输出怎么办?——那会消失)

*** 您可以使用以下代码验证此行为:

import 'dart:async';

void main() {
  
  int iter = 0;
  
  Timer myTimer = Timer.periodic(Duration(milliseconds: 10), (timer) {
    iter++;
   
    int temp = iter %1000;
    
    print("iter = $iter");
    print("iter %1000 = $temp");
  });

}
Run Code Online (Sandbox Code Playgroud)

asynchronous dart playgrounds dartpad

5
推荐指数
1
解决办法
504
查看次数

如何*准确地*从 Android Java *插件* 平台代码中访问 Flutter 资源?

我们想要定义一个可以从同一插件中的 Android 平台代码访问的 Flutter 资源。据称该文档位于此处。

请注意,我们不是在讨论 flutter 应用程序中的自定义平台代码——我们是从插件作者的角度讨论 flutter 插件代码。

因此,按照文档,我们从位于 [your_plugin_root_dir]\pubspec.yaml 的插件的 pubspec.yaml 文件开始,然后添加资产定义:

  assets:
    - assets/sound.wav
Run Code Online (Sandbox Code Playgroud)

这指向 [your_plugin_root_dir]\assets\sound.wav 中的现有文件

到目前为止一切都很好,但是我们遇到了一个问题:

当您在 Android studio 中创建新的 Flutter Plugin项目时,该插件的 Android Java 文件如下所示:

public class PluginTestPlugin implements FlutterPlugin, MethodCallHandler {
  /// The MethodChannel that will the communication between Flutter and native Android
  ///
  /// This local reference serves to register the plugin with the Flutter Engine and unregister it
  /// when the Flutter Engine is detached from the Activity …
Run Code Online (Sandbox Code Playgroud)

java android assets flutter flutter-plugin

5
推荐指数
1
解决办法
2041
查看次数

确保 Flutter 中应用终止期间操作完成

假设我们有一个 Flutter 应用程序,我们希望使用共享首选项来保存一些持久数据。

(我们不想每次用户更改数据时都持久保存数据,因为 UI 直接依赖于数据,为了保存数据,我们需要使用等待异步,这会滞后于 UI),因此我们使用 WidgetsBindingObserver检测应用程序何时进入后台,以便使用该事件作为保存数据的有效捕获所有机会。

因此,我们应用程序的根页面中有一些类似这样的代码:

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.paused) {
      // went to Background
      myPersistentData.instance.write(); // <-------------- this is an async operation
    }
    if (state == AppLifecycleState.resumed) {
      // came back to Foreground
    }
  }
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但我担心生命周期可能会很快超出“暂停”(暂停>停止>完成),以至于这个“尾随”操作没有时间完成......因此数据不会得救了。

这是合理的担忧吗?

concurrency lifecycle persistence dart flutter

5
推荐指数
1
解决办法
757
查看次数