安卓实现图片放大镜效果

Android实现图片放大镜效果
本文介绍了如何在Android中实现图片放大镜效果。首先,在drawable文件夹下放置图片资源。接着,创建一个包含ImageView的简单布局文件,并设置关键属性如`android:adjustViewBounds="true"`和`android:scaleType="centerInside"`。最后,编写OnTouchListener逻辑,处理可能的边界条件,如图片尺寸较小导致坐标负值的问题。

一、准备图片
在drawable文件夹下放置需要进行轮询的图片
这里写图片描述
二、编写一个简单的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center">
        <Button
            android:id="@+id/nextimg"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="下一张"/>
    </LinearLayout>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_gravity="center_horizontal">
        <!--定义显示图片整体的ImageView-->
        <ImageView
            android:id="@+id/big_image"
            android:layout_width="wrap_content"
            android:layout_height="240px"
            android:adjustViewBounds="true"
            android:scaleType="centerInside"/>
        <!--显示局部细节的ImageView-->
        <ImageView
            android:id="@+id/part_image"
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:layout_marginTop="10dp"/>
    </LinearLayout>
</LinearLayout>

三、进行业务逻辑代码的编写

package com.wuzhixiaobai.androidtest.test01;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.htss.androidtest.R;

import org.jetbrains.annotations.Nullable;

/**
 * Created by Administrator on 2018/num01/12.
 */

public class Test12Activity extends Activity{
    //用于存储图片ID值的数组
    private int[] images = new int[]{
        R.drawable.num01,
        R.drawable.num02,
        R.drawable.num03,
        R.drawable.num04,
        R.drawable.num05,
        R.drawable.num06,
    };
    private int currentImg = -1;
    private Button nextImg;
    private ImageView image1;
    private ImageView image2;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test12);
        initView();
        initData();
        addListener();
    }

    private void initView(){
        nextImg = findViewById(R.id.nextimg);
        image1 = findViewById(R.id.big_image);
        image2 = findViewById(R.id.part_image);
        image1.setImageResource(R.drawable.num01);
    }

    private void initData(){
        image1.setImageResource(images[++currentImg % images.length]);
        BitmapDrawable bitmapDrawable = (BitmapDrawable) image1.getDrawable();
        Bitmap bitmap = bitmapDrawable.getBitmap();
        image2.setImageBitmap(Bitmap.createBitmap(bitmap, 0, 0,
                120, 120));
    }

    private void addListener(){
        nextImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //当点击下一张的按钮时,实际上相当于进行两个IMageView的初始化,只是使用的图片不同了
                initData();
            }
        });

        image1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                BitmapDrawable bitmapDrawable = (BitmapDrawable) image1.getDrawable();
                Bitmap bitmap = bitmapDrawable.getBitmap();
                double scale = bitmap.getWidth() / 240.0;
                int x = (int) (motionEvent.getX() * scale);
                int y = (int) (motionEvent.getY() * scale);
                if (x + 120 > bitmap.getWidth()) {
                    int tempWidth = bitmap.getWidth() - 120;
                    //防止图片宽度过小而产生负值
                    x = tempWidth > 0 ? tempWidth : bitmap.getWidth();
                }
                if (y + 120 > bitmap.getHeight()) {
                    int tempHeight = bitmap.getHeight() - 120;
                    //防止图片高度过小而产生负值
                    y = tempHeight > 0 ? tempHeight : bitmap.getHeight();
                }
                image2.setImageBitmap(Bitmap.createBitmap(bitmap, x, y,
                        120, 120));
                return false;
            }
        });
    }
}

值得注意的地方:
1、布局文件中的
android:adjustViewBounds=”true”
android:scaleType=”centerInside”
这两句代码很重要,因为我的图片在ImageView中fitCenter显示,但是ImageView实际却比图片显示的大
这里写图片描述
导致点击图片显示以外的地方,都能够触发监听事件
2、OnTouchListener内部的逻辑代码编写要注意当图片宽或高过小,导致x和y出现负值的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值