您的位置:首页 > 移动开发 > Android开发

安卓实现图片放大镜效果

2018-01-15 17:05 197 查看
一、准备图片

在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, Mot
4000
ionEvent 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出现负值的情况
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 图片放大镜