Android可以动态控制图片显示区域的自定义ImageView

本文介绍了一个自定义的ScrollableImageView控件,适用于动态控制图片显示区域,如根据触摸改变图片位置或实现放大镜效果。控件已进行参数容错处理,只需传入偏移量即可,且支持设置默认偏移。使用步骤包括获取对象、设置图片内容及处理滚动距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个imageView经常需要动态的控制里面图片的显示区域,比如根据触摸去改变里面图片的显示位置,或者放大镜效果等,于是做了这么个自定义控件,亲测好用,而且已经做了参数容错,只要传入上下左右的偏移量即可,不用担心传入的数过大。而且还可以设置默认的偏移量

package com.npi.blureffect;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

/**
 * Custom view used to render an horizontal part (slice) of an image.
 * 
 * @author Nicolas POMEPUY
 * 
 */
class ScrollableImageView extends View {

	// A bitmap adapted to the View size
	private Bitmap adaptedImage;
	// A Paint object used to render the image
	private Paint paint = new Paint();
	// The original Bitmap
	private Bitmap originalImage;
	// The screen width used to render the image
	private int scrollY = 0;//初始纵轴偏移,应该为正
	private int scrollX = 0;//初始横轴偏移,应该为正

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

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

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

	/**
	 * Draws the view if the adapted image is not null
	 */
	@Override
	protected void onDraw(Canvas canvas) {

		if (adaptedImage != null)
			canvas.drawBitmap(adaptedImage, 0, 0, paint);

	}

	/**
	 * Handle an external scroll and render the image by switching it by a
	 * distance
	 * 最核心的方法
	 * 传入的应为正值,为向下和向右的偏移量
	 * @param distY
	 *            the distance from the top
	 */
	public void handleScroll(float distY,float distX) {
		if (getHeight() > 0 && getWidth()>0 && originalImage != null) {
			Log.i("Alex", "scrolly是"+scrollY+"  distY是"+distY+"  origi高是"+originalImage.getHeight()+"  自高是"+getHeight());
			Log.i("Alex", "scrolly是"+scrollX+"  distX是"+distX+"  origi宽是"+originalImage.getWidth()+"  自宽是"+getWidth());
			//distY为正值,正值向下滑
			//scrollY一直是0或负值
			//getHeight是自高
			if (Math.abs(scrollY+distY) <= originalImage.getHeight() - getHeight() && Math.abs(scrollX+distX) <= originalImage.getWidth() - getWidth()) {
				adaptedImage = Bitmap.createBitmap(originalImage, (int)distX+scrollX, (int) distY+scrollY, getWidth(), getHeight());

				invalidate();
			}
		}

	}

	public void setoriginalImage(Bitmap bmp) {
		this.originalImage = bmp;
		adaptedImage = Bitmap.createBitmap(bmp);
		invalidate();
	}


}
调用方法

1,先抓到对象

ScrollableImageView image = (ScrollableImageView) findViewById(R.id.window);

2、设置显示内容

image .setoriginalImage(一个bitmap对象);

3、确定移动距离

window.handleScroll(10f,20f);//横纵都移动,一般放在ontouchListener中执行



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值