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

    千次阅读 2013-11-15 15:32:21
    ImageView,图像视图,直接继承自View类,它的主要功能是用于显示图片,实际上它不仅仅可以用来显示图片,任何Drawable对象都可以使用ImageView来显示。ImageView可以适用于任何布局中,并且Android为其提供了缩放和...



    ImageView,图像视图,直接继承自View类,它的主要功能是用于显示图片,实际上它不仅仅可以用来显示图片,任何Drawable对象都可以使用ImageView来显示。ImageView可以适用于任何布局中,并且Android为其提供了缩放和着色的一些操作。


    ImageView的一些常用属性,并且这些属性都有与之对应的getter、setter方法:


    android:adjustViewBounds:设置ImageView是否调整自己的边界来保持所显示图片的长宽比。
    android:maxHeight:设置ImageView的最大高度。
    android:maxWidth:设置ImageView的最大宽度。
    android:scaleType:设置所显示的图片如何缩放或移动以适应ImageView的大小。
    android:src:设置ImageView所显示的Drawable对象的ID。
    对于android:scaleType属性,因为关于图像在ImageView中的显示效果,所以有如下属性值可以选择:


    matrix:使用matrix方式进行缩放。
    fitXY:横向、纵向独立缩放,以适应该ImageView。
    fitStart:保持纵横比缩放图片,并且将图片放在ImageView的左上角。
    fitCenter:保持纵横比缩放图片,缩放完成后将图片放在ImageView的中央。
    fitEnd:保持纵横比缩放图片,缩放完成后将图片放在ImageView的右下角。
    center:把图片放在ImageView的中央,但是不进行任何缩放。
    centerCrop:保持纵横比缩放图片,以使图片能完全覆盖ImageView。
    centerInside:保持纵横比缩放图片,以使得ImageView能完全显示该图片。
    展开全文
  • 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

    2015-06-10 23:32:06
    Android中圆形ImageView,自定义ImageView
  • imageView滤镜

    2016-09-12 18:23:57
    imageView,drawable设置滤镜描边
  • 自定义ImageView

    2017-08-11 14:03:31
    自定义ImageView方法
  • Android应用源码之imageView1_imageView
  • 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 的属性中设置悬停效果。 第 1 步:声明样式(my_styles.xml) < /declare-styleable > 第 2 步:自定义 ImageView(MyImageView.java) public class MyImageView extends ...
  • 安卓圆形imageview

    2016-12-05 17:10:01
    安卓圆形imageview
  • Androidstudio imageview

    2018-10-10 15:49:35
    imageview空间的使用,剪切图片显示圆角图片,使用anndroidstudio打开工程
  • 自定义圆形ImageView

    2018-10-09 14:06:37
    自定义圆形imageview,去除使用圆形imageview而导入各种包
  • Android-ImageView 存放整理的一些自定义的ImageView控件
  • 在Android Studio中创建ImageView。 您只需要签出MainActivity.java(app / src / main / java / com / example / geenu / checkboxes)和activity_main.xml(app / src / main / res / layout)文件的代码。
  • ImageView详解

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

    知识点简介

    ImageView在官方的介绍上说是显示任意图像,如图标。ImageView类可以从各种来源(如资源或内容提供程序)加载图像,负责从图像中计算其度量,以便可以在任何布局管理器中使用,并提供各种显示选项,如缩放和着色。

    基本使用方法

    1. xml
      xml中声明ImageView控件,然后在activity中通过findViewById()获取
        <ImageView
            android:id="@+id/image"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" 
            android:src="@mipmap/icon_check"/>
    
    public class MainActivity extends RxAppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ImageView imageView = (ImageView) findViewById(R.id.image);
        }
    
    }
    
    1. new
      通过new创建出ImageView对象,传入一个context
      ImageView view = new ImageView(this);
    

    常用属性

    常用属性详解

    • android:adjustViewBounds

     相关方法:setAdjustViewBounds(boolean)
     官方解释:通过调整ImageView的界限来保持图片的宽高比例

     adjustViewBounds参数默认为false,当我们需要使用它的时候将其设置为true,其scaleType自动为“fitCenter”(当scaleType与adjustViewBounds同时在xml中设置后,如果设置了scaleType,则由adjustViewBounds自动设置的scaleType将失效,因为scaleType优先级比adjustViewBounds高),并且会根据当前View的最大宽高来填充View的内容,并且需要配合上maxHeight与maxWidth一起使用才会有效,因为其需要一个ImageView的界限

      <ImageView
            android:id="@+id/image"
            android:maxHeight="30dp"
            android:maxWidth="30dp"
            android:adjustViewBounds="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@mipmap/icon_check"/>
    

    • android:baseline

     相关方法:setBaseline(int)
     官方解释:视图中基线的偏移量。

     baseline默认为-1,此时基线处于ImageView的顶部,当通过setBaseLine设置偏移量为正数时代表视图的基线向下偏移,为负数时向上偏移,下面我们可以通过代码与图片的结合清楚的了解那条基线的位置(当baseline与baselineAlignBottom同时存在一个视图中时,基线以设置了baselineAlignBottom为主)

    1. 设置偏移量为正数
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        >
    
        <TextView
            android:text="你好"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <ImageView
            android:baseline="50dp"
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>
    
    </LinearLayout>
    

    在这里插入图片描述

    1. 设置偏移量为负数
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
      >
    
        <TextView
            android:text="你好"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <ImageView
            android:baseline="-50dp"
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>
    
    </LinearLayout>
    

    偏移量为-50dp
    3. 不设置偏移量

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        >
    
        <TextView
            android:text="你好"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <ImageView
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>
    
    </LinearLayout>
    

    无偏移量


    • android:baselineAlignBottom
       相关方法:setBaselineAlignBottom(boolean)
       官方解释:如果为true,则图像视图将基于其底部边缘与基线对齐
       其实就是基线的位置处于ImageView的底部,展现出来的效果就是上图示例中我们的文字与图片底部对齐,其中baseline如果与baselineAlignBottom同时使用时,baseline设置得将毫无意义,基线位置以baselineAlignBottom设置的为主
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
     
        <TextView
            android:text="你好"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <ImageView
            android:baselineAlignBottom="true"
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>
            
        </LinearLayout>
    

    在这里插入图片描述


    • android:cropToPadding
       相关方法:setCropToPadding(boolean)
       官方解释:如果为true,该图像将被裁剪以适合其填充
       这个参数如果设置为true,ImageView在onDraw的时候会根据scrollX、scrollY、padding等等参数来对图片进行裁剪,并将裁剪后的图片填充到界面上
      onDraw方法
      <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        <TextView
            android:text="你好"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <ImageView
            android:paddingLeft="-20dp"
            android:cropToPadding="true"
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>
    
        </LinearLayout>
    

    在这里插入图片描述


    • android:maxHeight
       相关方法:setMaxHeight(int)
       官方解释:为视图提供最大的高度可选参数
      该参数与maxWidth作用相似,都是相当于给ImageView设置一个最大的宽或高,该参数必须与android:adjustViewBounds配合使用,单独使用无效

    • android:maxWidth
       相关方法: setMaxWidth(int)
       官方解释:为视图提供最大的宽度可选参数
      该参数与maxWidth作用相似,都是相当于给ImageView设置一个最大的宽或高,该参数必须与android:adjustViewBounds配合使用,单独使用无效

    • android:scaleType(重点掌握)
       相关方法:setScaleType(ImageView.caleType)
       官方解释:控制图像大小的调整或移动方式,以与此ImageView的大小匹配
      Type:
    1. CENTER

     图片居中展示,如果图片大与控件大小,则以中心为基准展示ImageView控件大小,图片多出的部分裁剪不展示,如果图片小于控件大小,则全部展示,其余地方留白

    1. CENTER_CROP

     图片进行等比的缩放或拉伸,直到有宽或高有一方能够等于控件的宽高,多余的不展示

    1. CENTER_INSIDE

     将图片进行等比缩放,完整的展示在ImageView上,没有铺张到的地方显示背景色留白

    1. FIT_CENTER

     默认模式,图片将进行等比缩放或放大,完整的展示在ImageView上,并且没有铺张到的地方显示背景色。这里与CENTER_INSIDE有点类似,区别在于当同时都是小图片的时候,FIT_CENTER会在小图片的时候将图片拉伸至控件大小,而CENTER_INSIDE则只会居中显示,不拉伸

    1. FIT_START

     图片进行等比缩放或放大,完整的展示在ImageView上,这一点和FIT_CENTER相似,不同点在于FIT_START是以左上为基准,当宽完整平铺展示并且高会有留白后,图片将在控件的上方,下方留白,如果高平铺展示,宽有留白时,则右边留白

    1. FIT_END

     图片进行等比缩放或放大,完整展示在ImageView上,与FIT_START效果相反

    1. FIT_XY

     图片进行缩放或放大(非等比),显示在ImageView上,这里不是等比缩放或放大,会将图片完整的展示在ImageView上,一般来说图片宽高比和控件宽高比不一致的情况下,图片会呈现扭曲感

    1. MATRIX

     指定一种矩阵,因为其他七种都是内部已经写好了矩阵,这一种为自己指定一种矩阵,配合setImageMatrix()方法使用
    快速记忆:其中CENTER,CENTER_CROP,CENTER_INSIDE共性:居中显示,FIT_CENTER,FIT_END,FIT_START,FIT_XY共性:对图片进行缩放,MATRIX指定矩阵


    • android:src
       相关方法: setImageResource(int)
       官方解释:将可绘制的内容设置给ImageView
      ImageView显示图片有两种方式,android:background和android:src两种,虽然两种都能做到显示图片,但是还是有很大的区别的,在下面专门开设一个节点详细讲解一下
      在这里插入图片描述
      在这里插入图片描述

    • android:tint
       相关方法:setColorFilter(int,PorterDuff.Mode)
       官方解释:设置图像的颜色
      这个方法翻译过来就是染色,它的作用就是改变图像每个像素的颜色,使用起来很简单,直接调用 setColorFilter();方法,传入ColorFilter,ColorFilter有三个派生子类LightingColorFilter,PorterDuffColorFilter,ColorMatrixColorFilter,这个方法虽然用起来很简单,但是其中却有很多细节,可以参考Android中ImageView的ColorFilter图像处理解析,讲的很详细。

    子类

    ImageButton

     ImageViewButton是一个类似Button的图像按钮

    • 可以根据android:src或setimageresource(int)来为其设置图像
    • 可以同时拥有前景和背景(前景在设置了固定的宽高后会出现图片失帧情况)
    • 可以设置选择器,根据按钮的不同状态来改变按钮的图像等等(要选择生效必须控件获取到焦点)
        <ImageButton
            android:id="@+id/imageview"
            android:src="@drawable/bottom_line_style"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    

    bottom_line_style.xml

     <?xml version="1.0" encoding="utf-8"?>
     <selector xmlns:android="http://schemas.android.com/apk/res/android">
         <item android:state_pressed="true"
               android:drawable="@drawable/button_pressed" /> <!-- pressed -->
         <item android:state_focused="true"
               android:drawable="@drawable/button_focused" /> <!-- focused -->
         <item android:drawable="@drawable/button_normal" /> <!-- default -->
     </selector>
    

    QuickContactBadge

     用于显示具有标准QuickContact徽章和单击行为的图像的小部件
    该方法现在用的不多了,参考文章:QuickContactBadge

    AppCompatImageView

     可以染色的ImageView,实现了TintableBackgroundView与TintableImageSourceView两个接口,用作对背景颜色进行动态改变,该ImageView在5.0以下的系统容易出现问题,较难排查,不建议使用

    注:在高版本中还有一些其他的子类,但是不常见,所以没有例举

    相关文章链接:

    ImageView的ScaleType原理及效果分析 :https://www.jianshu.com/p/fe5d2e3feed3
    ImageView的ScaleType详解 :https://www.cnblogs.com/pandapan/p/4614837.html
    Android中ImageView的ColorFilter图像处理解析 :https://www.jianshu.com/p/bbc77334be95
    关于圆角ImageView的几种实现方式 :https://www.jianshu.com/p/626dbd93207d

    展开全文
  • 主要介绍了Android自定义圆角ImageView的相关资料,需要的朋友可以参考下
  • 放大缩小imageview

    2014-07-10 22:41:07
    放大缩小imageview,包括viewpager 。 对imageview做进一步处理,使imageview可放大缩小
  • 拖动imageview,更改imageview的层次顺序以及大小 项目中采用了简单工厂 imageview为自定义,项目中并没有采用装饰模式,实际使用时,建议采用装饰模式对控件进行扩展 此demo可应用在pad上的小窗口视频播放(可拖动...
  • 缓慢缩放效果的imageView,只是imageVIew里的图片变化,不影响imageview本身尺寸。 原型效果来源于豌豆荚的《开眼》app。 ScreenShot Example Usage <com.dxjia.lulling.LullingImageView android:id="@+id/...
  • 圆形的ImageView可以完全替代安卓系统默认的ImageView,内附详细demo。
  • ImageView.zip

    2015-11-03 14:20:13
    ImageView基础属性详解 详见博文http://blog.csdn.net/a87b01c14/article/details/49615689
  • 主要介绍了Android使用RotateImageView 旋转ImageView 的相关资料,需要的朋友可以参考下
  • 在camera picture上有一个动态的imageview,现在我想在我选择的 imageview上设置刻度标记,在下面代码的基础上再如何修改呢? @Override protected void onCreate(Bundle savedInstanceState) { super....
  • android自定义ImageView

    2017-10-17 15:36:06
    android自定义ImageView,简单的一个自定义View的demo,该view有圆形和圆角矩形两种。
  • ImageView播放GIF动画

    2016-07-05 14:48:30
    自定义ImageView控件播放GIF动画
  • android-ImageView-如何给ImageView设置图片
  • 主要介绍了Android中ImageView用法,结合实例形式较为详细的分析了ImageView控件的功能,属性设置与使用相关技巧,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 261,042
精华内容 104,416
关键字:

imageview