V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wanttofly
V2EX  ›  Android

类似于微博长图的显示控件?

  •  
  •   wanttofly · 2016-05-17 21:07:53 +08:00 · 12269 次点击
    这是一个创建于 3145 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有没有可以现用的轮子?类似于微博,图片在 listView 中,打开时图片和屏幕等宽,可以进行缩放,滑动。 thanks
    27 条回复    2016-11-23 13:53:01 +08:00
    Totato5749
        1
    Totato5749  
       2016-05-17 21:13:02 +08:00
    同求。。。。。。。。。那个好像不是 listview ,好像跟 BitmapRegionDecode 有关,最近我也需要这样的轮子
    wanttofly
        2
    wanttofly  
    OP
       2016-05-17 21:27:03 +08:00
    @Totato5749 不是 ListView ,我的意思是图片是存在于 ListView 的 Item 中的,会有一个类似于缩略图的展示,点击然后会看到我说的效果:图片和屏幕等宽,可以进行缩放,滑动
    32
        3
    32  
       2016-05-18 10:11:45 +08:00
    github photoView ,没记错的话
    wanttofly
        4
    wanttofly  
    OP
       2016-05-18 10:35:45 +08:00
    @32 一开始就用了这个,但是这个是实现缩放的,想要与 屏幕等宽这个效果做不出来。
    32
        5
    32  
       2016-05-19 10:12:16 +08:00   ❤️ 1
    这个是可以更改的,我当时改了的,貌似在 PhotoView 的初始化方法里面定义了一个参数,改了源码
    32
        6
    32  
       2016-05-19 10:50:37 +08:00
    刚才找了一下代码,没找到...晚上如果找到了再来留言
    32
        7
    32  
       2016-05-19 13:30:52 +08:00
    public PhotoView(Context context, AttributeSet attr, int defStyle) {
    super(context, attr, defStyle);
    super.setScaleType(ScaleType.MATRIX);
    mAttacher = new PhotoViewAttacher(this);

    if (null != mPendingScaleType) {
    setScaleType(mPendingScaleType);
    mPendingScaleType = null;
    }

    this.setMaximumScale(23.0f);
    }
    32
        8
    32  
       2016-05-19 13:31:06 +08:00
    好像是那个 setMaximumScale
    wanttofly
        9
    wanttofly  
    OP
       2016-05-19 22:05:50 +08:00
    @32 thanks!昨天也在看这个东西,思路相似,不过一直在找具体的计算 sacle 的具体逻辑, setMaximumScale 是设置最大缩放比。非常感谢!
    32
        10
    32  
       2016-05-19 23:55:30 +08:00   ❤️ 1
    我当时是简单粗暴的解决方案,如果有更好的解决方案的话可以共享出来:-D
    这代码还是翻了好久才翻出来的.
    那个项目废弃快一年了都,快点谢谢本宝宝
    wanttofly
        11
    wanttofly  
    OP
       2016-05-20 15:40:52 +08:00
    @32 嗯嗯,还在继续搞呢。非常感谢,如果在北京请你吃饭啊。哈哈
    wenmingvs
        12
    wenmingvs  
       2016-05-21 05:52:13 +08:00 via Android   ❤️ 1
    你好,我的开源项目实现了你说的长微博自动缩放到屏幕长宽的功能,你不妨去看看。如果看不懂,我单独把这个轮子独立出来给你用 https://github.com/wenmingvs/WeiBo
    wanttofly
        13
    wanttofly  
    OP
       2016-05-21 16:51:58 +08:00
    @wenmingvs 非常感谢。不过我测试了下发现
    这张图片好像没有处理啊。因为它的长度超过了 4096 ,但是 android 里面是不允许高度或者宽度超过这个值的。
    wanttofly
        14
    wanttofly  
    OP
       2016-05-21 16:57:30 +08:00
    @wanttofly http://weibo.com/u/3229173402?from=feed&loc=nickname 这是测试微博账号,第一条微博。
    wanttofly
        15
    wanttofly  
    OP
       2016-05-21 17:14:16 +08:00
    @wenmingvs 哥哥哎,你这不就是用的 photoView 吗。。。改了哪儿。说下就好了。
    wenmingvs
        16
    wenmingvs  
       2016-05-21 17:37:02 +08:00
    PhotoView 对于非常大的图片,由于使用了硬件加速,当内存不足的时候会导致无法把图片转换成对应的 texture ,所以有时候一直会加载不出来,这种现象在一些低端设备中尤为明显。我正在尝试考虑使用 https://github.com/davemorrissey/subsampling-scale-image-view 替换掉 photoview 。他可以很好的支持长图,即使在低端设备上也能显示。后期会改


    自动缩放到和屏幕一样长,其实只需要设置一下 photoview 的 scaletype
    加入一下这行代码

    PhotoView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    wanttofly
        17
    wanttofly  
    OP
       2016-05-21 17:40:48 +08:00
    @32 哥们,现在我做的差不多,但是遇到个问题,能否不用其他的库(现在就打算用 photoView ),因为超过 4096px 的图片在 android 手机上是无法显示的,现在用 ImageLoader 可以展示出来缩略图,但是无法像其他的图片(即使是长图也可以)那样放大到屏幕等宽,只能看缩略图,然后手动放大。我在 13 楼发的图怎么样才能正常显示呢?有什么思路没?
    wanttofly
        18
    wanttofly  
    OP
       2016-05-21 17:43:04 +08:00
    @wenmingvs 嗯嗯,对的,刚看完你的代码,你是根据是否是长微博来手动设置的 ScaleType ,我拿到图片和屏幕尺寸进行的判断,差不多。但是我在 13 楼发的图那样,无法正常显示啊。。再看看你说的这个库。 thanks!
    32
        19
    32  
       2016-05-21 22:35:34 +08:00   ❤️ 1
    我依然是简单粗暴的方案,禁用硬件加速...
    长图片的坑确实不太好弄,当时还想的是判断图片长宽比,再决定硬件加速的启用与否.时间充足的话可以研究一下

    还有,并不是超过 4096.这个只是一个限制,如果你有一个 1*1000 的图片也同样会挂.长宽比的范围限制.并且 error 不是报在应用内的
    32
        20
    32  
       2016-05-21 22:40:26 +08:00   ❤️ 1
    刚才看了 @wenmingvs 的答案,确实会存在关掉硬件加速后黑屏的现象,有时候等待一会可以加载,有时候加载失败,需要重新从缩率图点击展示大图的流程走一遍.当时测试 QQ 也存在同样的问题.我的简单粗暴的解决方案,对比当时的 qq,视觉效果上是胜出的.但是性能什么的评测没有做...当时项目紧张,过了不到一个月,项目下线,又投入到新的项目了.所以这个坑一直没填...
    还有,缩率图的处理最好放在服务器.等比缩放后,直接往 imageView 里面放这个缩略图应该也是崩
    may123
        21
    may123  
       2016-06-06 23:01:09 +08:00
    请问楼主解决了,求助啊~~~
    wanttofly
        22
    wanttofly  
    OP
       2016-06-07 08:47:28 +08:00
    @may123 用 photoview 不过不太理想,然后根据图的长宽来设置 scaletype.后续有再改, jiyu
    wanttofly
        23
    wanttofly  
    OP
       2016-06-07 08:48:26 +08:00
    急于发版本,后边有进展会 @ 你的。话说好像有好多东西需要总结改进,哈哈。
    may123
        24
    may123  
       2016-06-07 09:36:35 +08:00
    @wanttofly 我现在是用的 ScaleType.CENTER_CROP,显示的是图片中间位置,请问楼主是这样设置么?谢谢楼主~~~
    wanttofly
        25
    wanttofly  
    OP
       2016-06-07 10:15:27 +08:00
    @may123 对的,长图的话就是用这个。
    wenmingvs
        26
    wenmingvs  
       2016-08-03 10:47:57 +08:00   ❤️ 1
    @32
    @Totato5749
    @may123
    @wanttofly

    来填坑了,长图问题正式解决了,使用的是 https://github.com/davemorrissey/subsampling-scale-image-view
    如果需要三级缓存,就这么写
    ImageLoader.getInstance().loadImage(url, mOptions, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap bitmap) {
    File file = DiskCacheUtils.findInCache(url, ImageLoader.getInstance().getDiskCache());
    if (imageUri.endsWith(".gif")) {
    subsamplingScaleImageView.setVisibility(View.VISIBLE);
    try {
    GifDrawable gifDrawable = new GifDrawable(file);
    subsamplingScaleImageView.setImageDrawable(gifDrawable);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    });


    这个功能已经使用在我的第三方新浪微博客户端上, https://github.com/wenmingvs/WeiBo ,目前情况良好,即使在低端设备上也能正常显示
    wanttofly
        27
    wanttofly  
    OP
       2016-11-23 13:53:01 +08:00
    @wenmingvs thanks 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5387 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 07:05 · PVG 15:05 · LAX 23:05 · JFK 02:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.