ImageView在开启硬件加速时加载长图
2015-09-16 19:27
260 查看
本文参考文章http://tieba.baidu.com/p/3064414697
Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); HashMap<Integer , Bitmap> mMap = (HashMap<Integer , Bitmap>)msg.obj; if(mMap !=null){ try{ mOtherRouteContainer.removeAllViews(); //先移除容器内的全部子view for(int i = 0 ; i < mMap.size() ; i ++){ ScaleImageView imageView = new ScaleImageView(GroupProductDetailActivity.this); float width = mMap.get(i).getWidth(); scale = (AppConfig.getScreenWidth() - ExtendUtils.dip2px(GroupProductDetailActivity.this, 20)) / width; LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT,(int)(mMap.get(i).getHeight()* scale)); imageView.zoomTo(scale); imageView.setLayoutParams(params); imageView.setImageBitmap(mMap.get(i)); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //imageview点击事件 if (mjourney != null) { Intent route_img_intent = new Intent(GroupProductDetailActivity.this, RouteBrowsePictureActivity.class); route_img_intent.putExtra(GlobalConstant.IntentConstant.ROUTE_IMG_URL, mjourney.image); route_img_intent.putExtra(GlobalConstant.IntentConstant.ROUTE_IMG_DOWNLOAD_URL, mjourney.pdfPath); startActivity(route_img_intent); } } }); mOtherRouteContainer.addView(imageView); } }catch(Exception e){ } } } }; /** * 新线程切割bitmap运算 */ public class calThread extends Thread{ private Bitmap bitmap; public calThread(Bitmap bitmap){ this.bitmap = bitmap; } @Override public void run() { super.run(); deviderBitmapToShow(bitmap); } } /** * bitmap 转换成 InputStream * @param bm * @return */ private InputStream Bitmap2IS(Bitmap bm){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); InputStream sbs = new ByteArrayInputStream(baos.toByteArray()); return sbs; } /** * 将原bitmap切割显示 * @param bitmap */ private void deviderBitmapToShow(Bitmap bitmap){ if(bitmap == null || bitmap.getHeight()<=0 || bitmap.getWidth()<=0){ return; } int num = 0 ; //要分割的份数 HashMap<Integer , Bitmap> mMap = new HashMap<>(); //保存bitmap的 hashmap Bitmap mbitmap = null; //切割后的bitmap Rect rect = null; BitmapRegionDecoder bitmapRegionDecoder = null; int height = bitmap.getHeight(); //bitmap的高度和寬度 num = height / 4000; if(height % 4000 > 0){ //如果height对4000取余未除尽,则n加1 num++; } try{ bitmapRegionDecoder = BitmapRegionDecoder.newInstance(Bitmap2IS(bitmap), false); for(int i = 0 ; i < num ; i ++){ if( num - i == 1 ){ rect = new Rect(0,4000 * i,bitmap.getWidth() ,height); }else{ rect = new Rect(0,4000 * i,bitmap.getWidth() ,4000 * (i+1)); } mbitmap = bitmapRegionDecoder.decodeRegion(rect,null); mMap.put(i, mbitmap); } Message msg = Message.obtain(); msg.obj = mMap; handler.sendMessage(msg); }catch (Exception e){ return; } }
相关文章推荐
- LeetCode(73)Set Matrix Zeroes
- 简单的四则运算
- 对“demo!demo.Index+HookProc::Invoke”垃圾收集的类型已委托回调。这可能会导致应用程序崩溃、损坏和数据丢失。当传递委托给非托管代码,托管应用程序必须让这些委托保持活着
- What is the "internal" interface and port for on Openvswitch?
- 放入购物车
- LeetCode(73)Set Matrix Zeroes
- Android开发环境的演变
- asp.net将sql语句封装在类库中
- ios学习之 关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系
- 自定义View
- JDK源码阅读之Cloneable接口
- HTML&CSS Learning Notes 4
- leetcode-31 Next Permutation 数字排列组合找到下一个更大值
- 从今天起,正式开始记录学习编程的点点滴滴
- C++入门第一步:一些格式上的注意
- c++简单用户界面
- 如何用代码控制NGUI中Sprite的图片?
- OGNL表达式
- leetcode-29 Divide Two Integers
- Palette状态栏颜色提取,写的不错就分享了