zoukankan      html  css  js  c++  java
  • Android加载网络长图的处理

    加载普通网络图片时ImageLoader是很省事的,但是今天碰到个加载长图的问题,需要全屏显示还能滑动,自己实际测试+找资料解决了问题

    下面说说思路:先根据图片地址转换成bitmap(有人会想到获得bitmap之后ImageView直接显示不就行了,but android手机蛋疼的地方到了,系统对bitmap的宽高有限制,比如我的小米4就是4065*4065,如果bitma宽高大于限制,就不会显示图片了),

                       把bitmap等分成几分,放在一个List<BitMap>集合里,然后循环动态加载ImageView并且显示bitmap。

    下面贴代码:(可能会有遗漏的地方 希望大家指正)

    布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
    android:id="@+id/ll_jl"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center_horizontal">

    </LinearLayout>

    </ScrollView>

    </LinearLayout>

    Java代码 用到了xUtils,可百度搜索
    /**
    * Created by yuLook on 2016/6/22.
    */
    public class CeShiActivity extends BaseActivity {

    @ViewInject(R.id.ll_jl)
    private LinearLayout ll_jl;

    private ArrayList<Bitmap>bitmapList;

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

    setContentView(R.layout.activity_ceshi);
    ViewUtils.inject(this);

    //开始异步任务下载图片
    asyncTask.execute();

    }

    private AsyncTask asyncTask=new AsyncTask() {
    @Override
    protected Object doInBackground(Object[] params) {

    try {
    URL url=new URL("http://uefa.oss-cn-beijing.aliyuncs.com/ftx2016/jiangpin.png");

    URLConnection connection=url.openConnection();

    connection.connect();

    InputStream is = connection.getInputStream();

    BitmapFactory.Options options = new BitmapFactory.Options();

    Bitmap bitmap = BitmapFactory.decodeStream(is,null,options);

    int index=bitmap.getHeight()/2000+1;

    bitmapList=new ArrayList<>();

    for(int i=0;i<index;i++){
    Bitmap bitmap3=Bitmap.createBitmap(bitmap,
    0,
    (int) ((double)bitmap.getHeight()/index*i),
    bitmap.getWidth(),
    (int) ((double) bitmap.getHeight()/index));

    bitmapList.add(bitmap3);

    }

    //释放bitmap 不然会造成内存泄漏
    bitmap.recycle();
    bitmap=null;

    //主线程发消息刷新界面
    handler.sendEmptyMessage(index);

    } catch (Exception e) {
    e.printStackTrace();
    }

    return null;
    }
    };


    private Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);

    //清除异步任务
    asyncTask.cancel(true);

    if(bitmapList.size()>0){
    Bitmap b = bitmapList.get(0);

    //计算宽高比例
    double a = (double) b.getHeight() / (double) b.getWidth();

    LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(
    ViewGroup.LayoutParams.MATCH_PARENT,
    (int) ((double)CommonTools.getScreenWidth(CeShiActivity.this)*a)
    );

    for(Bitmap bitmap:bitmapList){
    ImageView imageView=new ImageView(CeShiActivity.this);
    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    imageView.setLayoutParams(params);
    imageView.setImageBitmap(bitmap);
    ll_jl.addView(imageView);
    }

    }
    }
    };

    @Override
    protected void onDestroy() {
    super.onDestroy();

    //释放内存 防止内存泄漏造成内存溢出
    for(Bitmap bitmap:bitmapList){
    bitmap.recycle();
    bitmap=null;
    }

    }
    }
  • 相关阅读:
    SAP CRM呼叫中心和Hybris Backoffice的轮询设计
    SAP Hybris和Netweaver的集群模式以及集群模式下工作需要解决的问题
    Hybris Commerce的 Master Tenant和Netweaver的System Client
    使用代码创建SAP CRM服务请求文档的subject测试数据
    SAP CRM中间件下载出错的错误排查
    PHP 异常处理 throw new exception
    使用mysql乐观锁解决并发问题思路
    gatewayworker中使用tcp协议连接硬件设备获取数据报错解决办法!
    trycatche
    PHP(Mysql/Redis)消息队列的介绍及应用场景案例--转载
  • 原文地址:https://www.cnblogs.com/yulook/p/5610710.html
Copyright © 2011-2022 走看看