网上有关于
SubsamplingScaleImageView如何适配tv的按键操作的,我看了一下,几乎都是转发同一篇,试用一下效果我就不说了,要是行就没有这篇文章了.
SubsamplingScaleImageView是一个非常完整的加载大图的方案.而且具备了方向感知,旋转时不会重新解码.
直接进入正题.
tv没有手去摸,那么需要按键.图片查看需要的几个基本要素:
放大,缩小,平移.
对应的按键通常是,enter/ok键操作缩放.
四个方向键处理平移.
首先,拿到源码,然后添加一个方法就行:
public void animateToCenter(PointF sCenter) {
if (!isReady()) {
return;
}
new AnimationBuilder(sCenter).start();
}
这个方法是处理平移的,SubsamplingScaleImageView它的特点是,先计算中心点,然后再通过对中心点的偏移操作.默认的时候,缩放值不理想.那么在开始时应该先设置一个缩放值.
view.maxScale = 2f,我是这样设置的,实际上并不是指对图片缩放2倍,具体多少倍可以查看源码.我就不详细说明了.
它在加载图片的时候,缩放值并不是简单给个数字,是根据图片对应屏幕去计算的.
左右上下平移的时候,只要对中心点作偏移,然后调用上面的方法即可,动画什么的可以自己设置
另一个就是缩放.先看下它的缩放.
public final void setScaleAndCenter(float scale, @Nullable PointF sCenter) {
this.anim = null;
this.pendingScale = scale;
this.sPendingCenter = sCenter;
this.sRequestedCenter = sCenter;
invalidate();
}
缩放时,调用这个方法就可以了.
电视遥控的ok不能在onkeydown里面捕获,那么从更高级别的方法可以得到:
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
//这个操作会拦截所有的键,如果不仔细处理,会导致选中的功能也失效.
//Timber.d("dispatchKeyEvent.onKeyDown:${event.keyCode}, ${event.action}")
if (event.keyCode == KeyEvent.KEYCODE_DPAD_CENTER
&& event.action == KeyEvent.ACTION_DOWN
&& mode == MODE_SCALE
) {
var imageView: View? = null
if (binding.scaleImage.childCount > 0) {
imageView = binding.scaleImage.getChildAt(0)
}
if (imageView is SubsamplingScaleImageView) {
var scale = imageView.scale * 1.2f
if (scale > imageView.maxScale) {
scale = imageView.minScale
}
//Timber.d("dispatchKeyEvent.scale:${imageView.scale}, $scale, ${imageView.maxScale}, ${imageView.minScale}")
imageView.setScaleAndCenter(scale, imageView.center)
return true
}
}
return super.dispatchKeyEvent(event)
}
这个不复杂,按下时,缩放*1.2,直到超过了最大的值2,然后复位.我这里测试的是默认是0.108,一张超大图片长条型的.清明上河图.普通的应该不会差很多.
对于平移的按键:
val viewHeight = imageView.height
val currentCenter = imageView.center
currentCenter?.run {
val newX = currentCenter.x
val newY = currentCenter.y + (viewHeight * 0.2f)
//Timber.d("DPAD_DOWN:$currentCenter, $newX,$newY")
imageView.animateToCenter(PointF(newX.toFloat(), newY.toFloat()))
}
这是处理了down键的示例,其它的就是y-,或者x+-一个偏移量,这里偏移一次按宽/高的0.2倍算.
具体值可以调整到比较舒服的值
23万+

被折叠的 条评论
为什么被折叠?



