Android——图片放大镜效果

骑猪看日落 2022-06-06 05:19 527阅读 0赞

Android——图片放大镜效果

前言:使用两种方法实现图片放大镜效果,随着手在屏幕上的移动来放大相应位置的图片。

布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:app="http://schemas.android.com/apk/res-auto"
  5. xmlns:tools="http://schemas.android.com/tools"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent">
  8. <com.tracy.testdemo.Magnifier
  9. android:id="@+id/myview"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"/>
  12. </android.support.constraint.ConstraintLayout>

自定义View:实现图片的放大镜效果

方法一:

  1. public class Magnifier extends View {
  2. private final Path mPath = new Path();
  3. private final Matrix matrix = new Matrix();
  4. private DisplayMetrics dm;
  5. private int mScreenWidth,mScreenHeight;
  6. private Bitmap bitmap;
  7. // 放大镜的半径
  8. private static final int RADIUS = 160;
  9. // 放大倍数
  10. private static final float FACTOR = 2.0f;
  11. private int mCurrentX, mCurrentY;
  12. public Magnifier(Context context) {
  13. this(context, null);
  14. }
  15. public Magnifier(Context context, @Nullable AttributeSet attrs) {
  16. super(context, attrs);
  17. mPath.addCircle(RADIUS, RADIUS, 0, Path.Direction.CW);
  18. matrix.setScale(FACTOR, FACTOR);
  19. dm = getResources().getDisplayMetrics();
  20. mScreenWidth = dm.widthPixels;
  21. mScreenHeight = dm.heightPixels;
  22. bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.map);
  23. bitmap = upImageSize(bitmap);
  24. }
  25. @Override
  26. public boolean onTouchEvent(MotionEvent event) {
  27. mCurrentX = (int) event.getX();
  28. mCurrentY = (int) event.getY();
  29. invalidate();
  30. return true;
  31. }
  32. @Override
  33. protected void onDraw(Canvas canvas) {
  34. super.onDraw(canvas);
  35. mPath.addCircle(RADIUS, RADIUS, RADIUS, Path.Direction.CW);
  36. // 底图
  37. canvas.drawBitmap(bitmap, 0, 0, null);
  38. // 剪切
  39. canvas.translate(mCurrentX - RADIUS, mCurrentY - RADIUS);
  40. canvas.clipPath(mPath);
  41. // 画放大后的图
  42. canvas.translate(RADIUS - mCurrentX * FACTOR, RADIUS - mCurrentY
  43. * FACTOR);
  44. canvas.drawBitmap(bitmap, matrix, null);
  45. }
  46. //等比缩放图片资源
  47. public Bitmap upImageSize(Bitmap bmp) {
  48. if (bmp == null){
  49. return null;
  50. }
  51. // 计算比例
  52. float scaleX = (float) mScreenWidth / bmp.getWidth();// 宽的比例
  53. float scaleY = (float) mScreenHeight / bmp.getHeight();// 高的比例
  54. //新的宽高
  55. int newW = 0;
  56. int newH = 0;
  57. if(scaleX < scaleY){
  58. newW = (int) (bmp.getWidth() * scaleX);
  59. newH = (int) (bmp.getHeight() * scaleX);
  60. }else if(scaleX >= scaleY){
  61. newW = (int) (bmp.getWidth() * scaleY);
  62. newH = (int) (bmp.getHeight() * scaleY);
  63. }
  64. Log.i("Bitmap rate:", scaleX+","+scaleY);
  65. return Bitmap.createScaledBitmap(bmp, newW, newH, true);
  66. }
  67. }

方法二:

  1. public class Magnifier extends View {
  2. private final Bitmap bitmap;
  3. private final ShapeDrawable drawable;
  4. // 放大镜的半径
  5. private static final int RADIUS = 220;
  6. // 放大倍数
  7. private static final float FACTOR = 1.5f;
  8. private final Matrix matrix = new Matrix();
  9. public Magnifier(Context context) {
  10. this(context, null);
  11. }
  12. public Magnifier(Context context, @Nullable AttributeSet attrs) {
  13. super(context, attrs);
  14. DisplayMetrics dm = getResources().getDisplayMetrics();
  15. int mScreenWidth = dm.widthPixels;
  16. int mScreenHeight = dm.heightPixels;
  17. Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.map);
  18. Bitmap bmp1 = upImageSize(null, bmp, mScreenWidth, mScreenHeight);
  19. bitmap = bmp1;
  20. BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(bmp1,
  21. (int) (bmp1.getWidth() * FACTOR), (int) (bmp1.getHeight() * FACTOR), true), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  22. // 圆形的drawable
  23. drawable = new ShapeDrawable(new OvalShape());
  24. drawable.getPaint().setShader(shader);
  25. drawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2);
  26. }
  27. public Bitmap upImageSize(Context context,Bitmap bmp, int width,int height) {
  28. if (bmp == null){
  29. return null;
  30. }
  31. // 计算比例
  32. float scaleX = (float)width / bmp.getWidth();// 宽的比例
  33. float scaleY = (float)height / bmp.getHeight();// 高的比例
  34. //新的宽高
  35. int newW = 0;
  36. int newH = 0;
  37. if(scaleX < scaleY){
  38. newW = (int) (bmp.getWidth() * scaleX);
  39. newH = (int) (bmp.getHeight() * scaleX);
  40. }else if(scaleX >= scaleY){
  41. newW = (int) (bmp.getWidth() * scaleY);
  42. newH = (int) (bmp.getHeight() * scaleY);
  43. }
  44. return Bitmap.createScaledBitmap(bmp, newW, newH, true);
  45. }
  46. @Override
  47. public boolean onTouchEvent(MotionEvent event) {
  48. final int x = (int) event.getX();
  49. final int y = (int) event.getY();
  50. // 这个位置表示的是,画shader的起始位置
  51. matrix.setTranslate(RADIUS - x * FACTOR, RADIUS - y * FACTOR);
  52. drawable.getPaint().getShader().setLocalMatrix(matrix);
  53. // bounds,就是那个圆的外切矩形
  54. drawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS, y + RADIUS);
  55. invalidate();
  56. return true;
  57. }
  58. @Override
  59. protected void onDraw(Canvas canvas) {
  60. super.onDraw(canvas);
  61. canvas.drawBitmap(bitmap, 0, 0, null);
  62. canvas.translate(0, -RADIUS);
  63. drawable.draw(canvas);
  64. }
  65. }

Activity文件:

  1. public class TestActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_test);
  6. }
  7. }

发表评论

表情:
评论列表 (有 0 条评论,527人围观)

还没有评论,来说两句吧...

相关阅读