`

保证图片长宽比的同时拉伸图片ImageView

阅读更多
按比例放大图片,不拉伸失真
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;

public class AspectRatioImageView extends ImageView {

    public AspectRatioImageView(Context context) {
        super(context);
    }

    public AspectRatioImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AspectRatioImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth();
        setMeasuredDimension(width, height);
    }
}


也试试下面这个:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;

public class RatioImageView extends ImageView {

    private int originalWidth;
    private int originalHeight;

    public RatioImageView(Context context) {
        this(context, null);
    }

    public RatioImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RatioImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setOriginalSize(int originalWidth, int originalHeight) {
        this.originalWidth = originalWidth;
        this.originalHeight = originalHeight;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (originalWidth > 0 && originalHeight > 0) {
            float ratio = (float) originalWidth / (float) originalHeight;

            int width = MeasureSpec.getSize(widthMeasureSpec);
            int height = MeasureSpec.getSize(heightMeasureSpec);

            if (width > 0) {
                height = (int) ((float) width / ratio);
            } else if (height > 0) {
                width = (int) ((float) height * ratio);
            }

            setMeasuredDimension(width, height);
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

}




import android.content.Context;
import android.net.Uri;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.ImageView;

import com.laowch.githubtrends.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

/**
 * Created by lao on 3/4/14.
 */
public class AsyncImageView extends ImageView {


    String url;

    ImageLoadingListener imageLoadingListener;

    public AsyncImageView(final Context context) {
        super(context);
        init();
    }

    public AsyncImageView(final Context context, final AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public AsyncImageView(final Context context, final AttributeSet attrs, final int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public void setImageLoadingListener(ImageLoadingListener listener) {
        this.imageLoadingListener = listener;
    }

    protected void init() {

    }

    public void loadImage(final String imageUrl) {
        if (imageUrl != null && url != null) {
            if (Uri.parse(imageUrl).getPath().equals(Uri.parse(url).getPath())) {
                return;
            }
        }
        url = imageUrl;
        executeLoadImage();
    }


    protected void executeLoadImage() {

        if (TextUtils.isEmpty(url)) {
            setImageResource(R.drawable.image_loading_resource);
        } else {

            DisplayImageOptions.Builder builder = new DisplayImageOptions.Builder()
                    .showImageOnLoading(R.drawable.image_loading_resource)
                    .cacheInMemory(true)
                    .cacheOnDisk(true)
                    .displayer(new SimpleBitmapDisplayer());

            DisplayImageOptions options = builder.build();
            ImageLoader.getInstance().displayImage(url, this, options, imageLoadingListener);
        }
    }
}



import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;

public class SquareImageView extends ImageView {


    public SquareImageView(Context context) {
        super(context);
    }

    public SquareImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SquareImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth());
    }
}




import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

public class SquareLayout extends RelativeLayout {

    public SquareLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public SquareLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SquareLayout(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), getDefaultSize(0, heightMeasureSpec));

        heightMeasureSpec = widthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

import android.content.Context;
import android.util.AttributeSet;
import android.util.SparseIntArray;
import android.view.View;
import android.widget.ImageView;

import java.util.ArrayList;

public class MultiStateView extends ImageView
        implements View.OnClickListener {

    private SparseIntArray mStateMap;
    private ArrayList<Integer> mStateList;
    private int mCurState;
    private IStateChangeListener mListener;

    public MultiStateView(Context context) {
        super(context);
        init();
    }


    public MultiStateView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MultiStateView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        mStateMap = new SparseIntArray();
        mStateList = new ArrayList<>();
        setOnClickListener(this);
    }

    public void addStateAndImage(final int state, final int resId) {
        post(new Runnable() {
            @Override
            public void run() {
                mStateMap.put(state, resId);
                mStateList.add(state);
                if (mStateList.size() == 1) {
                    mCurState = state;
                    show(false);
                }
            }
        });
    }

    public void show(final int state) {
        if (mCurState == state) return;
        post(new Runnable() {
            @Override
            public void run() {
                mCurState = state;
                show(false);
            }
        });
    }

    private void show(boolean shouldNotify) {

        int id = mStateMap.get(mCurState);
        if (id == 0) return;


        setImageResource(id);

        if (shouldNotify && mListener != null) {
            mListener.onStateChange(mCurState);
        }
    }

    public void setOnStateChangeListener(IStateChangeListener listener) {
        this.mListener = listener;
    }

    @Override
    public void onClick(View v) {
        int size = mStateList.size();
        for (int i = 0; i < size; i++) {
            if (mCurState == mStateList.get(i)) {
                mCurState = mStateList.get((i + 1) % size);
                break;
            }
        }
        show(true);
    }


    public interface IStateChangeListener {
        void onStateChange(int state);
    }

}

用法:
实现implements MultiStateView.IStateChangeListener接口,重写onStateChange(int state)

......
mPlayModeView = (MultiStateView) findViewById(R.id.play_mode);
......
private void initPlayMode() {
        mPlayModeView.setOnStateChangeListener(this);
        mPlayModeView.addStateAndImage(SongManager.STATE_ALL, R.drawable.play_all);
        mPlayModeView.addStateAndImage(SongManager.STATE_RANDOM, R.drawable.play_random);
        mPlayModeView.addStateAndImage(SongManager.STATE_SINGLE, R.drawable.play_single);

        int state = SharedUtils.getInt(this, Constants.KEY_PLAY_MODE, SongManager.STATE_ALL);
        mPlayModeView.show(state);
    }
.......
@Override
    public void onStateChange(int state) {
        switch (state) {
            case SongManager.STATE_ALL:
                ToastUtils.show(this, "顺序播放");
                SharedUtils.saveInt(this, Constants.KEY_PLAY_MODE, state);
                SongManager.with(this).initPlayList();
                break;
            case SongManager.STATE_RANDOM:
                ToastUtils.show(this, "随机播放");
                SharedUtils.saveInt(this, Constants.KEY_PLAY_MODE, state);
                SongManager.with(this).initPlayList();
                break;
            case SongManager.STATE_SINGLE:
                ToastUtils.show(this, "单曲循环");
                SharedUtils.saveInt(this, Constants.KEY_PLAY_MODE, state);
                SongManager.with(this).initPlayList();
                break;
            case SongManager.STATE_PINGING:
                mPlayService.play();
                break;
            case SongManager.STATE_PAUSE:
                mPlayService.pause();
                break;
        }
    }

分享到:
评论

相关推荐

    Android ImageView图片放大到全屏显示

    本篇将详细探讨如何利用ImageView实现图片的放大功能,特别是如何让图片全屏显示,并支持局部拉伸放大,以及双击放大这一交互效果。 首先,我们需要了解ImageView的基础用法。ImageView继承自View类,通过设置其`...

    ImageView加载图片

    例如,若要保持图片的宽高比并填充整个`ImageView`,可以这样设置: ```xml &lt;ImageView android:scaleType="centerCrop" &lt;!-- 这里 --&gt; ... /&gt; ``` 此外,`ImageView`还支持添加点击事件监听器,可以实现点击...

    android imageview 图片缩放

    本文将深入探讨如何在Android中实现ImageView的图片缩放功能,同时结合异步加载和Activity的半透明效果,提升用户体验。 首先,我们要理解Android中ImageView的基本用法。ImageView可以设置为固定大小或根据图片...

    android 在imageview上的指定位置添加图片 图片尺寸自适应

    在Android开发中,有时我们需要在ImageView上添加额外的图片,比如在主背景上叠加徽标或者水印。这个过程涉及到图像处理和布局管理,需要掌握一些关键知识点。本篇文章将详细讲解如何在ImageView上指定位置添加图片...

    Android通过ImageView实现图片的显示和切换

    本文将深入探讨如何使用ImageView来显示图片,并介绍如何通过按钮控制图片的切换,实现简单的图片浏览功能。 首先,让我们了解ImageView的基本用法。在Android布局文件中,我们可以创建一个ImageView并设置其属性,...

    android ImageView网络图片加载、动态设置尺寸、圆角(绝对好用)

    在实际应用中,我们不仅需要显示本地资源中的图像,还经常需要从网络上加载图片,同时可能还需要根据界面需求动态设置ImageView的尺寸以及实现圆角效果。下面将详细讲解这些知识点。 1. **网络图片加载** Android...

    Imageview之图片填充模式Centercrop模式实现

    3. `CENTER_INSIDE`:图像居中显示,同时保证图像完全在ImageView内,图像会按比例缩放。 4. `FIT_CENTER`:图像居中并按比例缩放,使得图像的宽度或高度与ImageView相匹配。 5. `FIT_END` 和 `FIT_START`:分别将...

    点击ImageView放大阅览图片

    我们可以通过设置ImageView的ScaleType(如CENTER_CROP、FIT_CENTER等)来调整图片在视图中的显示方式,同时可以结合Bitmap的inSampleSize参数来降低加载图片的内存消耗。 此外,对于图片的平移操作,我们需要记录...

    android 将Imageview生成图片后保存到本地相册的实现

    android 将Imageview 将view生成图片后保存到本地相册的实现生成图片后保存到本地相册的实现,android 将Imageview生成图片后保存到本地相册的实现 android 将Imageview生成图片后保存到本地相册的实现, 有需要的朋友...

    android安卓通过url获取网络图片并显示在imageview中

    在Android开发中,将网络上的图片加载到ImageView控件中是一项常见的需求。本文将详细介绍如何通过URL获取网络图片并将其显示在ImageView上。我们将使用一个简单的示例来演示这一过程,该示例是从百度官网获取其logo...

    自定义ImageView图片缩放

    本文将深入探讨如何自定义一个ImageView来实现图片的网络获取与适应性缩放,这对于我们处理图片展示,尤其是网络图片,有着非常实用的价值。 首先,我们要明白自定义ImageView的主要目标是解决图片在不同设备和屏幕...

    Imageview之图片填充模式fitcenter的实现

    这样,图片既不会被拉伸变形,又能保证在视图中完全可见。具体来说,`fitCenter`会先将图片缩放至适合ImageView大小的比例,然后将其水平和垂直居中。 以下是`fitCenter`模式的实现步骤: 1. 计算图片原始宽高比:...

    自定义ImageView实现图片的缩放功能

    本文将深入探讨如何通过自定义ImageView来实现图片的缩放功能。在Android的UI设计中,ImageView通常用于显示图像,但默认情况下,它并不支持复杂的交互操作,如平移、缩放等。为了满足这些需求,我们需要对其进行...

    ImageView ,图片处理,progressDialog

    在Android开发中,`ImageView`是用于展示图片的常用组件,它允许我们加载本地或网络上的图像,并提供了基本的图片处理功能。当我们需要对图片进行更复杂的操作,如缩放、旋转或者显示加载进度时,就需要自定义`...

    自定义网络图片的Imageview类

    在Android开发中,ImageView是用于显示图像的常见组件,它支持本地资源图片、网络图片等多种显示方式。在一些特定需求下,我们可能需要对ImageView进行自定义,以便更好地适应项目需求,例如添加缓存机制、处理加载...

    jQuery imageview图片放大插件点击图片拖动放大查看

    jQuery imageview图片放大插件点击图片拖动放大查看 jQuery imageview图片放大插件点击图片拖动放大查看 jQuery imageview图片放大插件点击图片拖动放大查看 jQuery imageview图片放大插件点击图片拖动放大查看

    android图片放大缩小 ImageView

    例如,FIT_XY会按比例拉伸图片以填满整个ImageView,可能导致图片失真;而FIT_CENTER则会保持图片比例,居中显示,可能会有空白区域。 2. **Matrix操作**: 更精细的缩放控制可以通过修改ImageView的Matrix实现。...

    imageview图片圆角方法

    在Android开发中,对ImageView中的图片进行圆角处理是一种常见的需求,这不仅能够提升应用的美观度,还能根据不同的场景创造出更加和谐的视觉效果。本文将深入探讨如何使用自定义方法来实现ImageView中图片的圆角...

    android imageview获取网络图片

    在Android开发中,ImageView是用于显示图像的常见组件,它广泛应用于各种场景,如应用图标、用户头像或背景图片等。当需要显示网络上的图片时,就需要进行网络请求并将其加载到ImageView中。本教程将详细介绍如何在...

    改变图片亮度的ImageView

    在Android开发中,`ImageView` 是一个非常常用的组件,它用于显示图像资源,如本地图片或网络图片。在本案例中,我们关注的是一个特殊功能的`ImageView`,它可以动态改变图片的亮度,使得用户可以通过点击来调整图片...

Global site tag (gtag.js) - Google Analytics