我尝试使用反射获取android.view.ScaleGestureDetector中的字段android.view.ScaleGestureDetector
ScaleGestureDetector sgd = new ScaleGestureDetector(view.getContext(), sl);
try {
Field field = sgd.getClass().getDeclaredField("mMinSpan");
field.setAccessible(true);
field.set(sgd,1);
} catch (Exception e) {
e.printStackTrace();
}但是它总是有NoSuchFieldException,我发现它可能是由ProGuard引起的。因此,我编辑了我的守护规则. add,添加了一些代码:
-keepclassmembers class android.view.ScaleGestureDetector {
private <fields>;
}或
-keepclassmembers class android.view.ScaleGestureDetector {
private *;
}它仍然有NoSuchFieldException.Something在这里是不对的?谢谢!
发布于 2020-08-26 06:04:45
如源代码所示
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 123768938)
private int mMinSpan;UnsupportedAppUsage意味着,如果targetSdkVersion大于28 ( Build.VERSION_CODES.P,则根本无法访问mMinSpan,甚至可以通过反射访问mMinSpan,正如对非SDK接口的限制所解释的那样)。正如该页面所提到的,在尝试访问这些非SDK字段时,需要有一个NoSuchFieldException。
当然,再看一遍在源代码中
mMinSpan = viewConfiguration.getScaledMinimumScalingSpan();getScaledMinimumScalingSpan() 是API 29中公共API的部分(确切地说,您不能通过反射访问字段)。因此,您可以在API 28或更低版本上运行基于反射的代码,并在API 29和更高版本上使用公共API:
ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
in minSpan = viewConfiguration.getScaledMinimumScalingSpan();发布于 2022-07-20 08:43:43
我将ScaleGestureDetector类从compileSdkVersion 30复制到我的项目中。
同时,改变了mMinSpan
发自:
mMinSpan = viewConfiguration.getScaledMinimumScalingSpan();至:
mMinSpan = 0;https://stackoverflow.com/questions/63591250
复制相似问题