SubsamplingScaleImageView适配tv

网上有关于

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倍算.

具体值可以调整到比较舒服的值

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值