精华内容
下载资源
问答
  • ImageView

    2016-11-15 23:20:38
    ImageView

    1.src属性和background属性的区别:


    在API文档中我们发现ImageView有两个可以设置图片的属性,分别是:src和background

    常识:

    ①background通常指的都是背景,而src指的是内容!!

    ②当使用src填入图片时,是按照图片大小直接填充,并不会进行拉伸

    而使用background填入图片,则是会根据ImageView给定的宽度来进行拉伸

    2.adjustViewBounds设置缩放是否保存原图长宽比

    ImageView为我们提供了adjustViewBounds属性,用于设置缩放时是否保持原图长宽比! 单独设置不起作用,需要配合maxWidthmaxHeight属性一起使用!而后面这两个属性 也是需要adjustViewBounds为true才会生效的~

    • android:maxHeight:设置ImageView的最大高度
    • android:maxWidth:设置ImageView的最大宽度

    3.scaleType设置缩放类型

    android:scaleType用于设置显示的图片如何缩放或者移动以适应ImageView的大小 Java代码中可以通过imageView.setScaleType(ImageView.ScaleType.CENTER);来设置~ 可选值如下:

    • fitXY:对图像的横向与纵向进行独立缩放,使得该图片完全适应ImageView,但是图片的横纵比可能会发生改变
    • fitStart:保持纵横比缩放图片,知道较长的边与Image的编程相等,缩放完成后将图片放在ImageView的左上角
    • fitCenter:同上,缩放后放于中间;
    • fitEnd:同上,缩放后放于右下角;
    • center:保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。
    • centerCrop:保持横纵比缩放图片,知道完全覆盖ImageView,可能会出现图片的显示不完全
    • centerInside:保持横纵比缩放图片,直到ImageView能够完全地显示图片
    • matrix:默认值,不改变原图的大小,从ImageView的左上角开始绘制原图, 原图超过ImageView的部分作裁剪处理

    展开全文
  • imageView

    2016-01-19 18:15:41
    - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor cyanColor];... UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 500)];
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor cyanColor];
        
        UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 500)];
        imageView.backgroundColor = [UIColor whiteColor];
        [self.view addSubview:imageView];
        imageView.center = self.view.center;
        imageView.image = [UIImage imageNamed:@"1.png"];
        
        //填充图像位置  因为imageView继承自UIView 所以UIView属性可以被继承,imageView经常用到下面这个属性
        //UIViewContentModeBottom               最下面居中
        //UIViewContentModeBottomLeft           最下面靠左
        //UIViewContentModeBottomRight          最下面靠右
        //UIViewContentModeCenter               居中
        //UIViewContentModeLeft                 居中靠左
        //UIViewContentModeRight                居中靠右
        //UIViewContentModeRedraw               铺满imageView
        //UIViewContentModeScaleAspectFill      根据imageView最大边长等比例放大,imageView随之一样大
        //UIViewContentModeScaleAspectFit       image根据imageView最小边长等比例缩放,imageView不变
        //UIViewContentModeScaleToFill          填满imageView
        //UIViewContentModeTop                  最上面居中
        //UIViewContentModeTopLeft              最上面居中
        //UIViewContentModeTopRight             最上面居中
        
        imageView.contentMode = UIViewContentModeTop;
    
    
        //打开imageView的用户响应,默认为NO。若要为imageView添加响应事件需置为YES
    //    imageView.userInteractionEnabled = YES;
    
    }
    
    <pre name="code" class="objc">//    UIImageView 是用来展示图片的,但是也可以播放动态图片
    //  mac系统的动态图片存在桌面上,打开后显示为xxx.tiff格式图片,把这些图片导入到工程中,存在imageView里,代码如下:
    
    //(1)准备素材,存在数组中
        NSMutableArray *arr = [NSMutableArray array];
        for (int i = 1; i < 23; i++) {
            UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"run%d.tiff",i]];
            [arr addObject:image];
        }
        //(3)指定ImageView的素材库 为上面的数组
        self.imageView.animationImages = arr;
        //(4)设置循环时间
        self.imageView.animationDuration = 1.0f;
        //(5)循环次数,0 为无限循环
        self.imageView.animationRepeatCount = 0;
        //(6)开始 动画
        [self.imageView startAnimating];
    
        //开始执行动画
        [self.imageview startAnimating];
    
        //停止动画
        [imageView stopAnimating];
        
        //动画播放状态
        BOOL flag = [imageView isAnimating];
    
    
     

    
    

    关于UIImageView内存问题,用动画为例子。代码与上面的相同,注释不一样

     //清理图片所占内存
        //经常用的图片放在Images.xcasssets中的图片,不能用imageWithContentsOfFile方法
        //不经常用的图片直接托拖入工程即可
        NSMutableArray *imgArr = [NSMutableArray array];
        for (int i = 1; i < 14; i++) {
            //系统管理图片,内存不释放
            NSString *str = [NSString stringWithFormat:@"%d.png",i];
    
            //imageNamed 不能释放,数组置为空也不行,图片在缓存中
            //UIImage *image = [UIImage imageNamed:str];
            
            //自己从文件获取,数组改变时上一组图片释放,可手动释放,把数组置为空就行
            //获取图片路径
            NSString *path = [[NSBundle mainBundle] pathForResource:str ofType:nil];
            UIImage *image = [UIImage imageWithContentsOfFile:path];
            
            [imgArr addObject:image];
        }
        //下面代码与上面的动画一样,可不看,若想试验内存问题 粘贴复制即可。
        self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
        self.imageView.backgroundColor = [UIColor cyanColor];
        [self.view addSubview:self.imageView];
        self.imageView.center = self.view.center;
        self.imageView.animationImages = imgArr;
        self.imageView.animationDuration = 1;
        self.imageView.animationRepeatCount = 10;
        [self.imageView startAnimating];
        
        //动画播放完毕后清理
        //清理image内存  下面的方法是一种消息处理方法,具体以后在分析
        [self performSelector:@selector(clearImg) withObject:nil afterDelay:1];
    
    
    //清理数组
    -(void)clearImg{
        self.imageView.animationImages = nil;
    } 



    展开全文
  • Android在ImageView上直接显示网络图片

    万次阅读 多人点赞 2017-08-16 18:33:19
    在原生的ImageView中,没有一个方法是可以直接显示网络的图片的,当我们经常需要显示网络图片时,每次都有一大堆的操作,这会很麻烦,今天就教大家在ImageView上轻松显示网络图片。 自定义ImageView方法 写一个类让...

    原文博客:Doi技术团队
    链接地址:https://blog.doiduoyi.com/authors/1584446358138
    初心:记录优秀的Doi技术团队学习经历

           在原生的ImageView中,没有一个方法是可以直接显示网络的图片的,当我们经常需要显示网络图片时,每次都有一大堆的操作,这会很麻烦,今天就教大家在ImageView上轻松显示网络图片。

    自定义ImageView方法

    写一个类让它继承ImageView,并增加一个setImageURL(path)方法

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Handler;
    import android.os.Message;
    import android.util.AttributeSet;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class MyImageView extends ImageView {
        public static final int GET_DATA_SUCCESS = 1;
        public static final int NETWORK_ERROR = 2;
        public static final int SERVER_ERROR = 3;
        //子线程不能操作UI,通过Handler设置图片
        private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
               switch (msg.what){
                   case GET_DATA_SUCCESS:
                       Bitmap bitmap = (Bitmap) msg.obj;
                       setImageBitmap(bitmap);
                       break;
                   case NETWORK_ERROR:
                       Toast.makeText(getContext(),"网络连接失败",Toast.LENGTH_SHORT).show();
                       break;
                   case SERVER_ERROR:
                       Toast.makeText(getContext(),"服务器发生错误",Toast.LENGTH_SHORT).show();
                       break;
               }
            }
        };
    
        public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public MyImageView(Context context) {
            super(context);
        }
    
        public MyImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        //设置网络图片
        public void setImageURL(final String path) {
            //开启一个线程用于联网
            new Thread() {
                @Override
                public void run() {
                    try {
                        //把传过来的路径转成URL
                        URL url = new URL(path);
                        //获取连接
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        //使用GET方法访问网络
                        connection.setRequestMethod("GET");
                        //超时时间为10秒
                        connection.setConnectTimeout(10000);
                        //获取返回码
                        int code = connection.getResponseCode();
                        if (code == 200) {
                            InputStream inputStream = connection.getInputStream();
                            //使用工厂把网络的输入流生产Bitmap
                            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                            //利用Message把图片发给Handler
                            Message msg = Message.obtain();
                            msg.obj = bitmap;
                            msg.what = GET_DATA_SUCCESS;
                            handler.sendMessage(msg);
                   inputStream.close();
                        }else {
                            //服务启发生错误
                            handler.sendEmptyMessage(SERVER_ERROR);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                        //网络连接错误
                        handler.sendEmptyMessage(NETWORK_ERROR);
                    }
                }
            }.start();
        }
    
    }

     

    在布局上不能使用ImageView,要使用MyImageView,要把刚才重写的一个MyImageView的全路径写上

     

    <Button
            android:text="加载网络图片"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/button" />
    
        <com.example.dell.myapplication.MyImageView
            android:id="@+id/image_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    在MainActivity上,只要调用setImageURL(),直接把网络的图片路径写上就可以显示网络的图片了

    final MyImageView myImageView = (MyImageView) findViewById(R.id.image_view);
            Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
              //直接把网络的图片路径写上就可以显示网络的图片了
                    myImageView.setImageURL("https://pic.cnblogs.com/avatar/1142647/20170416093225.png");
                }
            });

    最后别忘了添加访问网络的权限

    <uses-permission android:name="android.permission.INTERNET"/>

    效果图

    压缩

           这是比较简单的从网络获取照片,直接在ImageView上显示,但是你有没有考虑过如果网络的图片很大,已经超出了手机屏幕的大小,如果还是加载原图的话无疑是浪费内存,还有可能造成内存溢出,所以我们有必要对网络的图片进行压缩,下面就开始讲网络图片的压缩。

    首先获取ImageView要显示的宽度和高度

     

        /**
         * 获取ImageView实际的宽度
         * @return 返回ImageView实际的宽度
         */
        public int realImageViewWith() {
            DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
            ViewGroup.LayoutParams layoutParams = getLayoutParams();
    
            //如果ImageView设置了宽度就可以获取实在宽带
            int width = getWidth();
            if (width <= 0) {
                //如果ImageView没有设置宽度,就获取父级容器的宽度
                width = layoutParams.width;
            }
            if (width <= 0) {
                //获取ImageView宽度的最大值
                width = getMaxWidth();
            }
            if (width <= 0) {
                //获取屏幕的宽度
                width = displayMetrics.widthPixels;
            }
            Log.e("ImageView实际的宽度", String.valueOf(width));
            return width;
        }
    
        /**
         * 获取ImageView实际的高度
         * @return 返回ImageView实际的高度
         */
        public int realImageViewHeight() {
            DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
            ViewGroup.LayoutParams layoutParams = getLayoutParams();
    
            //如果ImageView设置了高度就可以获取实在宽度
            int height = getHeight();
            if (height <= 0) {
                //如果ImageView没有设置高度,就获取父级容器的高度
                height = layoutParams.height;
            }
            if (height <= 0) {
                //获取ImageView高度的最大值
                height = getMaxHeight();
            }
            if (height <= 0) {
                //获取ImageView高度的最大值
                height = displayMetrics.heightPixels;
            }
            Log.e("ImageView实际的高度", String.valueOf(height));
            return height;
        }

    然后是通过网络图片的大小计算要压缩的比率

        /**
         * 获得需要压缩的比率
         *
         * @param options 需要传入已经BitmapFactory.decodeStream(is, null, options);
         * @return 返回压缩的比率,最小为1
         */
        public int getInSampleSize(BitmapFactory.Options options) {
            int inSampleSize = 1;
            int realWith = realImageViewWith();
            int realHeight = realImageViewHeight();
    
            int outWidth = options.outWidth;
            Log.e("网络图片实际的宽度", String.valueOf(outWidth));
            int outHeight = options.outHeight;
            Log.e("网络图片实际的高度", String.valueOf(outHeight));
    
            //获取比率最大的那个
            if (outWidth > realWith || outHeight > realHeight) {
                int withRadio = Math.round(outWidth / realWith);
                int heightRadio = Math.round(outHeight / realHeight);
                inSampleSize = withRadio > heightRadio ? withRadio : heightRadio;
            }
            Log.e("压缩比率", String.valueOf(inSampleSize));
            return inSampleSize;
        }

    获得压缩比率后,就可以进行压缩了

        /**
         * 根据输入流返回一个压缩的图片
         * @param input 图片的输入流
         * @return 压缩的图片
         */
        public Bitmap getCompressBitmap(InputStream input) {
            //因为InputStream要使用两次,但是使用一次就无效了,所以需要复制两个
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try {
                byte[] buffer = new byte[1024];
                int len;
                while ((len = input.read(buffer)) > -1 ) {
                    baos.write(buffer, 0, len);
                }
                baos.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            //复制新的输入流
            InputStream is = new ByteArrayInputStream(baos.toByteArray());
            InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
    
            //只是获取网络图片的大小,并没有真正获取图片
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(is, null, options);
            //获取图片并进行压缩
            options.inSampleSize = getInSampleSize(options);
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeStream(is2, null, options);
        }

    最后就是在setImageURL()的方法中把 Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 改成下面的方法

    Bitmap bitmap = getCompressBitmap(inputStream);

    缓存

    有时候提高运行效率和节省流量,经常会使用的缓存,数据缓存后就算没有网络都可以使用,下面就开始学习缓存吧,我这种缓存不是正规的缓存技术。

    将setImageURL()方法改成如下,并增加两全局变量imagePath、isUseCache;

        //是否启用缓存
        public boolean isUseCache = false;
       private String imagePath;
    
        //设置网络图片
        public void setImageURL(String path) {
            imagePath = path;
            if (isUseCache){
                useCacheImage();
            }else {
                useNetWorkImage();
            }
        }

    把之前setImageURL()的大部分功能放到useNetWorkImage()方法中,增加一个判断:是否缓存图片

        //使用网络图片显示
        public void useNetWorkImage(){
            //开启一个线程用于联网
            new Thread() {
                @Override
                public void run() {
                    try {
                        //把传过来的路径转成URL
                        URL url = new URL(imagePath);
                        //获取连接
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        //使用GET方法访问网络
                        connection.setRequestMethod("GET");
                        //超时时间为10秒
                        connection.setConnectTimeout(10000);
                        //获取返回码
                        int code = connection.getResponseCode();
                        if (code == 200) {
                            Bitmap bitmap;
                            //获取网络输入流
                            InputStream inputStream = connection.getInputStream();
    
                            //判断是否使用缓存图片
                            if (isUseCache){
                                //因为InputStream要使用两次,但是使用一次就无效了,所以需要复制两个
                                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                                try {
                                    byte[] buffer = new byte[1024];
                                    int len;
                                    while ((len = inputStream.read(buffer)) > -1) {
                                        baos.write(buffer, 0, len);
                                    }
                                    baos.flush();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
    
                                //复制新的输入流
                                InputStream is = new ByteArrayInputStream(baos.toByteArray());
                                InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
    
                                //调用压缩方法显示图片
                                 bitmap = getCompressBitmap(is);
                                //调用缓存图片方法
                                cacheImage(is2);
                            }else {
                                //调用压缩方法
                                 bitmap = getCompressBitmap(inputStream);
                            }
    
                            //利用Message把图片发给Handler
                            Message msg = Message.obtain();
                            msg.obj = bitmap;
                            msg.what = GET_DATA_SUCCESS;
                            handler.sendMessage(msg);
                            inputStream.close();
                        } else {
                            //服务启发生错误
                            handler.sendEmptyMessage(SERVER_ERROR);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                        //网络连接错误
                        handler.sendEmptyMessage(NETWORK_ERROR);
                    }
                }
            }.start();
        }

     创建一个方法用于根据传了的网址生成一个独一无二文件,之后会根据这个路径生成图片和查找是否有缓存图片

        /**
         * 根据网址生成一个文件名
         * @return 文件名
         */
        public String getURLPath() {
            StringBuilder urlStr2 = new StringBuilder();
            String[] strings = imagePath.split("\\/");
            for (String string : strings) {
                urlStr2.append(string);
            }
            Log.e("MyImageView","文件名:"+urlStr2.toString());
            return urlStr2.toString();
        }

    根据生成的路径缓存图片

        /**
         * 缓存网络的图片
         * @param inputStream 网络的输入流
         */
        public void cacheImage(InputStream inputStream) {
            try {
                File file = new File(getContext().getCacheDir(), getURLPath());
                FileOutputStream fos = new FileOutputStream(file);
                int len;
                byte[] buffer = new byte[1024];
                while ((len = inputStream.read(buffer)) != -1) {
                    fos.write(buffer, 0, len);
                }
                fos.close();
                Log.e("MyImageView","缓存成功");
            } catch (IOException e) {
                e.printStackTrace();
                Log.e("MyImageView","缓存失败");
            }
        }

    最后就可以直接使用缓存图片了

        //使用缓存图片
        public void useCacheImage() {
            //创建路径一样的文件
            File file = new File(getContext().getCacheDir(), getURLPath());
            //判断文件是否存在
            if (file != null && file.length() > 0) {
                //使用本地图片
                try {
                    InputStream inputStream = new FileInputStream(file);
                    //调用压缩方法显示图片
                    Bitmap bitmap = getCompressBitmap(inputStream);
                    //利用Message把图片发给Handler
                    Message msg = Message.obtain();
                    msg.obj = bitmap;
                    msg.what = GET_DATA_SUCCESS;
                    handler.sendMessage(msg);
                    Log.e("MyImageView","使用缓存图片");
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }else {
                //使用网络图片
                useNetWorkImage();
                Log.e("MyImageView","使用网络图片");
            }
        }

    现在就可以使用缓存了,记得要吧isUseCache设置成true

            //直接把网络的图片路径写上就可以显示网络的图片了
              String url = "https://pic.cnblogs.com/avatar/1142647/20170416093225.png";
             //设置成true才会启动缓存,默认是false
              myImageView.isUseCache = true;
             myImageView.setImageURL(url); 

    整篇MyImageView.java的代码

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Handler;
    import android.os.Message;
    import android.util.AttributeSet;
    import android.util.DisplayMetrics;
    import android.util.Log;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class MyImageView extends ImageView {
        private String imagePath;
        //是否启用缓存
        public boolean isUseCache = false;
    
        public static final int GET_DATA_SUCCESS = 1;
        public static final int NETWORK_ERROR = 2;
        public static final int SERVER_ERROR = 3;
        //子线程不能操作UI,通过Handler设置图片
        private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case GET_DATA_SUCCESS:
                        Bitmap bitmap = (Bitmap) msg.obj;
                        setImageBitmap(bitmap);
                        break;
                    case NETWORK_ERROR:
                        Toast.makeText(getContext(), "网络连接失败", Toast.LENGTH_SHORT).show();
                        break;
                    case SERVER_ERROR:
                        Toast.makeText(getContext(), "服务器发生错误", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        };
    
        public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public MyImageView(Context context) {
            super(context);
        }
    
        public MyImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        //设置网络图片
        public void setImageURL(String path) {
            imagePath = path;
            if (isUseCache){
                useCacheImage();
            }else {
                useNetWorkImage();
            }
        }
    
        //使用网络图片显示
        public void useNetWorkImage(){
            //开启一个线程用于联网
            new Thread() {
                @Override
                public void run() {
                    try {
                        //把传过来的路径转成URL
                        URL url = new URL(imagePath);
                        //获取连接
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        //使用GET方法访问网络
                        connection.setRequestMethod("GET");
                        //超时时间为10秒
                        connection.setConnectTimeout(10000);
                        //获取返回码
                        int code = connection.getResponseCode();
                        if (code == 200) {
                            Bitmap bitmap;
                            //获取网络输入流
                            InputStream inputStream = connection.getInputStream();
    
                            //判断是否使用缓存图片
                            if (isUseCache){
                                //因为InputStream要使用两次,但是使用一次就无效了,所以需要复制两个
                                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                                try {
                                    byte[] buffer = new byte[1024];
                                    int len;
                                    while ((len = inputStream.read(buffer)) > -1) {
                                        baos.write(buffer, 0, len);
                                    }
                                    baos.flush();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
    
                                //复制新的输入流
                                InputStream is = new ByteArrayInputStream(baos.toByteArray());
                                InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
    
                                //调用压缩方法显示图片
                                 bitmap = getCompressBitmap(is);
                                //调用缓存图片方法
                                cacheImage(is2);
                            }else {
                                //调用压缩方法
                                 bitmap = getCompressBitmap(inputStream);
                            }
    
                            //利用Message把图片发给Handler
                            Message msg = Message.obtain();
                            msg.obj = bitmap;
                            msg.what = GET_DATA_SUCCESS;
                            handler.sendMessage(msg);
                            inputStream.close();
                        } else {
                            //服务启发生错误
                            handler.sendEmptyMessage(SERVER_ERROR);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                        //网络连接错误
                        handler.sendEmptyMessage(NETWORK_ERROR);
                    }
                }
            }.start();
        }
    
        //使用缓存图片
        public void useCacheImage() {
            //创建路径一样的文件
            File file = new File(getContext().getCacheDir(), getURLPath());
            //判断文件是否存在
            if (file != null && file.length() > 0) {
                //使用本地图片
                try {
                    InputStream inputStream = new FileInputStream(file);
                    //调用压缩方法显示图片
                    Bitmap bitmap = getCompressBitmap(inputStream);
                    //利用Message把图片发给Handler
                    Message msg = Message.obtain();
                    msg.obj = bitmap;
                    msg.what = GET_DATA_SUCCESS;
                    handler.sendMessage(msg);
                    Log.e("MyImageView","使用缓存图片");
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }else {
                //使用网络图片
                useNetWorkImage();
                Log.e("MyImageView","使用网络图片");
            }
        }
    
        /**
         * 缓存网络的图片
         * @param inputStream 网络的输入流
         */
        public void cacheImage(InputStream inputStream) {
            try {
                File file = new File(getContext().getCacheDir(), getURLPath());
                FileOutputStream fos = new FileOutputStream(file);
                int len;
                byte[] buffer = new byte[1024];
                while ((len = inputStream.read(buffer)) != -1) {
                    fos.write(buffer, 0, len);
                }
                fos.close();
                Log.e("MyImageView","缓存成功");
            } catch (IOException e) {
                e.printStackTrace();
                Log.e("MyImageView","缓存失败");
            }
        }
    
        /**
         * 根据网址生成一个文件名
         * @return 文件名
         */
        public String getURLPath() {
            StringBuilder urlStr2 = new StringBuilder();
            String[] strings = imagePath.split("\\/");
            for (String string : strings) {
                urlStr2.append(string);
            }
            Log.e("MyImageView","文件名:"+urlStr2.toString());
            return urlStr2.toString();
        }
    
    
        /**
         * 根据输入流返回一个压缩的图片
         *
         * @param input 图片的输入流
         * @return 压缩的图片
         */
        public Bitmap getCompressBitmap(InputStream input) {
            //因为InputStream要使用两次,但是使用一次就无效了,所以需要复制两个
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try {
                byte[] buffer = new byte[1024];
                int len;
                while ((len = input.read(buffer)) > -1) {
                    baos.write(buffer, 0, len);
                }
                baos.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            //复制新的输入流
            InputStream is = new ByteArrayInputStream(baos.toByteArray());
            InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
    
            //只是获取网络图片的大小,并没有真正获取图片
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(is, null, options);
            //获取图片并进行压缩
            options.inSampleSize = getInSampleSize(options);
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeStream(is2, null, options);
        }
    
        /**
         * 获得需要压缩的比率
         *
         * @param options 需要传入已经BitmapFactory.decodeStream(is, null, options);
         * @return 返回压缩的比率,最小为1
         */
        public int getInSampleSize(BitmapFactory.Options options) {
            int inSampleSize = 1;
            int realWith = realImageViewWith();
            int realHeight = realImageViewHeight();
    
            int outWidth = options.outWidth;
            Log.e("网络图片实际的宽度", String.valueOf(outWidth));
            int outHeight = options.outHeight;
            Log.e("网络图片实际的高度", String.valueOf(outHeight));
    
            //获取比率最大的那个
            if (outWidth > realWith || outHeight > realHeight) {
                int withRadio = Math.round(outWidth / realWith);
                int heightRadio = Math.round(outHeight / realHeight);
                inSampleSize = withRadio > heightRadio ? withRadio : heightRadio;
            }
            Log.e("压缩比率", String.valueOf(inSampleSize));
            return inSampleSize;
        }
    
    
        /**
         * 获取ImageView实际的宽度
         *
         * @return 返回ImageView实际的宽度
         */
        public int realImageViewWith() {
            DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
            ViewGroup.LayoutParams layoutParams = getLayoutParams();
    
            //如果ImageView设置了宽度就可以获取实在宽带
            int width = getWidth();
            if (width <= 0) {
                //如果ImageView没有设置宽度,就获取父级容器的宽度
                width = layoutParams.width;
            }
            if (width <= 0) {
                //获取ImageView宽度的最大值
                width = getMaxWidth();
            }
            if (width <= 0) {
                //获取屏幕的宽度
                width = displayMetrics.widthPixels;
            }
            Log.e("ImageView实际的宽度", String.valueOf(width));
            return width;
        }
    
        /**
         * 获取ImageView实际的高度
         *
         * @return 返回ImageView实际的高度
         */
        public int realImageViewHeight() {
            DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
            ViewGroup.LayoutParams layoutParams = getLayoutParams();
    
            //如果ImageView设置了高度就可以获取实在宽度
            int height = getHeight();
            if (height <= 0) {
                //如果ImageView没有设置高度,就获取父级容器的高度
                height = layoutParams.height;
            }
            if (height <= 0) {
                //获取ImageView高度的最大值
                height = getMaxHeight();
            }
            if (height <= 0) {
                //获取ImageView高度的最大值
                height = displayMetrics.heightPixels;
            }
            Log.e("ImageView实际的高度", String.valueOf(height));
            return height;
        }
    }
     使用网络图片的效果图

    使用缓存图片的效果图

     

    使用图片加载框架Glide

     在这开源非常发达的时代,肯定会有大牛为我们做了个种各样的开源框架,根本不需要我们做这么复杂的工作,下面就简单使用图片加载框架Glide

    在使用前要添加Glide的依赖库

    compile 'com.github.bumptech.glide:glide:4.0.0'

    刚才的条件不变,把点击事件的操作换成下面两行代码

     

    String url = "https://pic.cnblogs.com/avatar/1142647/20170416093225.png";
    Glide.with(MainActivity.this).load(url).into(myImageView);

    是不是非常简单,有了这个开源库,你还愿意写那一大堆的代码吗,我想不会,更强大的是它已经有缓存功能,这一切它都帮你做好了。

    加载网络图片的效果图

    使用缓存的效果图

    既然那么强大的开源库,我们就简单地了解它是如何使用的,先看看with()方法的源码,它可以接收6中参数,所以在各种情况下都能使用

        public static RequestManager with(Context context) {
            return getRetriever(context).get(context);
        }
    
        public static RequestManager with(Activity activity) {
            return getRetriever(activity).get(activity);
        }
    
        public static RequestManager with(FragmentActivity activity) {
            return getRetriever(activity).get(activity);
        }
    
        public static RequestManager with(android.app.Fragment fragment) {
            return getRetriever(fragment.getActivity()).get(fragment);
        }
    
        public static RequestManager with(Fragment fragment) {
            return getRetriever(fragment.getActivity()).get(fragment);
        }
    
        public static RequestManager with(View view) {
            return getRetriever(view.getContext()).get(view);
        }

    然后是load()方法,虽然只有一个方法,但是所能做的事情却不少,比如我刚才只是传了一个String类型的,它就可以帮我加载了网络的图片,它还支持File(加载本地图片)、int(加载应用文件的源)、byte[](字节流)、Uri

    public RequestBuilder<Drawable> load(@Nullable Object model) {
        return asDrawable().load(model);
      }

     我们就试试加载应用的图片

    Glide.with(MainActivity.this).load(R.mipmap.ic_launcher).into(myImageView);

    效果图

    最后是into()方法,就是把我们要显示的ImageView加载进去,那就大功告成了。

    重复使用过程Glide-->with()-->load()-->into()

    项目源代码:https://resource.doiduoyi.com/#2o4csq2

     

    展开全文
  • ImageView的scaleType的属性理解

    万次阅读 多人点赞 2017-08-04 14:05:15
    ImageView的scaleType的属性值有MATRIX,FIT_XY,FIT_START,FIT_END,FIT_CENTER,CENTER,CENTER_CROP,CENTER_INSIDE.1.android:scaleType=“center” 保持原图的大小,显示在ImageView的中心。当原图的size大于...

    ImageView的scaleType的属性值有MATRIX,FIT_XY,FIT_START,FIT_END,FIT_CENTER,CENTER,CENTER_CROP,CENTER_INSIDE.

    1.android:scaleType=“center”
    保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size时,多出来的部分被截掉。
    2.android:scaleType=“center_inside”
    以原图正常显示为目的,如果原图大小大于ImageView的size,就按照比例缩小原图的宽高,居中显示在ImageView中。如果原图size小于ImageView的size,则不做处理居中显示图片。
    3.android:scaleType=“center_crop”
    以原图填满ImageView为目的,如果原图size大于ImageView的size,则与center_inside一样,按比例缩小,居中显示在ImageView上。如果原图size小于ImageView的size,则按比例拉升原图的宽和高,填充ImageView居中显示。
    4.android:scaleType=“matrix”
    不改变原图的大小,从ImageView的左上角开始绘制,超出部分做剪切处理。
    5.androd:scaleType=“fit_xy”
    把图片按照指定的大小在ImageView中显示,拉伸显示图片,不保持原比例,填满ImageView.
    6.android:scaleType=“fit_start”
    把原图按照比例放大缩小到ImageView的高度,显示在ImageView的start(前部/上部)。
    7.android:sacleType=“fit_center”
    把原图按照比例放大缩小到ImageView的高度,显示在ImageView的center(中部/居中显示)。
    8.android:scaleType=“fit_end”
    把原图按照比例放大缩小到ImageView的高度,显示在ImageVIew的end(后部/尾部/底部)

    这里写图片描述

    宇宝守护神的个人站点


    扫码加入我的个人微信公众号,一起学习Android开发知识!!
    在这里插入图片描述

    展开全文
  • ImageView详解

    千次阅读 2019-03-25 13:48:11
    ImageView详解前言基本使用方法属性属性详解子类绘制原理关于ImageView可能会遇到的问题 前言 ImageView在官方的介绍上说是显示任意图像,如图标。ImageView类可以从各种来源(如资源或内容提供程序)加载图像,负责...
  • swift ImageView

    2018-04-03 00:25:24
    let imageview = UIImageView(frame:CGRect(x:10,y:10,width:100,height:100)); imageview.image = UIImage(named:""); self.view .addSubview(imageview); //可以点击交互 imageview.is...
  • 和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、ImageView 的继承关系二、ImageView 常用方法三、ImageView 背景 间距属性设置四、使用Bitmap 类型动态设置ImageView ...
  • 在camera picture上有一个动态的imageview,现在我想在我选择的 imageview上设置刻度标记,在下面代码的基础上再如何修改呢? @Override protected void onCreate(Bundle savedInstanceState) { super....
  • android-ImageView-如何给ImageView设置图片
  • ImageView的ScaleType

    2020-06-04 10:55:02
    版权声明:本文为延成原创文章,转载请标明出处 ...ImageView大小固定,图片适配ImageView,图片按照ImageView大小缩放或扩大,直到宽高一方或全和ImageView宽高相等,图片完全在ImageView内部.
  • Bitmap转换成ImageView & ImageView转换成Bitmap
  • ImageView 使用详解

    千次阅读 2019-06-20 17:11:42
    极力推荐文章:欢迎收藏Android 干货分享...一、ImageView 的继承关系 二、ImageView 常用方法 三、ImageView 背景 间距属性设置 四、使用Bitmap 类型动态设置ImageView 资源 五、ImageView 图片倒影实现 六、ImageV...
  • ( ImageView )——ImageView设置填充方式

    千次阅读 2018-07-27 15:10:30
    ImageView设置填充方式 设置ImageView填充方式的前提是使用src作为设置图片的来源,否则的话,会导致图片填充方式设置无效的情况。 scaleType=“matrix” 是保持原图大小、从左上角的点开始,以矩阵形式绘图。 ...
  • ImageView属性

    2015-08-24 21:16:25
    adnroid:scaleType ——>控制图片如何resized/moved来匹对 ImageView的size;android:scaleType值的含义以及效果示意图: * center 按图片本来的大小进行显示,当图片长/宽超过ImageView的固定长宽的时候则截取图片...
  • ImageView 设置图片

    2019-01-22 13:58:52
    ImageView 设置图片
  • Android ImageView属性

    千次阅读 2020-01-27 16:29:40
    ImageView 继承自View组件,主要功能是用于显示图片,实际上它不仅仅可以用来显示图片,任何Drawable对象都可以使用ImageView来显示。ImageView可以适用于任何布局中,并且Android为其提供了缩放和着色的一些操作。 ...
  • imageview画圆

    2014-07-15 10:08:45
    imageview.layer.masksToBounds = YES; imageview.layer.cornerRadius = 35;
  • ImageView imageView = new ImageView(this); Log.e("error","103"); imageView.setImageBitmap(bitmap); Log.e("error","105"); //根据图片的大小,为图片挖坑 LinearLayout.LayoutParams ...
  • JavaFX 控件 ImageView

    2020-05-26 22:47:58
    ImageView 支持格式: BMP GIF JPEG PNG //加载图片 //如果设置了 requestedXXX 尺寸, ImageView中 设置 FitXXX 尺寸是基于requestedXXX 尺寸缩放 Image image = new Image( String url, double requestedWidth, ...
  • ![图片说明](https://img-ask.csdn.net/upload/201611/17/1479355334_672202.jpg) 点击Go按钮 , 五个ImageView自动绕着中间人物头像转圈,圈数随机, 每转一次外围少一个ImageView, 麻烦哪位大神帮忙看下,在线急等!
  • 获取ImageView图片

    2018-05-24 14:46:00
    //设置可以获取imageView缓存 imageView.setDrawingCacheEnabled(true); //然后通过getDrawingCache方法获取BitMap Bitmap drawingCache = imageView.getDrawingCache(); ByteArrayOut...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,988
精华内容 12,395
关键字:

imageview