Android笔记
——自定义缩放控件 【若对该知识点有更多想了解的,欢迎私信博主~~】
Drawable类的介绍:https://blog.csdn.net/feather_wch/article/details/79124608
Math类的介绍:https://blog.csdn.net/a22422931/article/details/52129417
制作:
package com
.example
.sirl
.daypractice
.T1
;
import android
.content
.Context
;
import android
.graphics
.Canvas
;
import android
.graphics
.drawable
.Drawable
;
import android
.support
.v7
.widget
.AppCompatImageView
;
import android
.util
.AttributeSet
;
import android
.util
.Log
;
import android
.view
.MotionEvent
;
import java
.util
.Calendar
;
public class MyView2 extends AppCompatImageView {
private Drawable drawable
;
private double old
= 0;
private float x
= 1.0f, y
= 1.0f;
private float downx
, downy
;
private float movex
= 1.0f, movey
= 1.0f;
int state
= 0;
Long time
;
public MyView2(Context context
, AttributeSet attrs
) {
super(context
, attrs
);
drawable
= getDrawable();
}
@Override
protected void onDraw(Canvas canvas
) {
canvas
.scale(x
, y
, getWidth() / 2, getHeight() / 2);
canvas
.translate(movex
, movey
);
canvas
.save();
super.onDraw(canvas
);
}
@Override
public boolean onTouchEvent(MotionEvent event
) {
Calendar calendar
= Calendar
.getInstance();
if (event
.getPointerCount() == 1) {
if (event
.getAction() == event
.ACTION_DOWN
) {
downx
= event
.getX() - movex
;
downy
= event
.getY() - movey
;
if (state
== 0) {
state
= 1;
time
= calendar
.getTime().getTime();
}
else if (state
== 1) {
if (calendar
.getTime().getTime() - time
< 300) {
x
= 2.0f;
y
= 2.0f;
state
= 2;
invalidate();
}
else {
state
= 0;
}
}
else if (state
==2){
state
=3;
}
}
else if (event
.getAction() == event
.ACTION_MOVE
) {
movex
= event
.getX() - downx
;
movey
= event
.getY() - downy
;
invalidate();
}
else if (event
.getAction() == event
.ACTION_UP
) {
if (state
== 3) {
x
= 1.0f;
y
= 1.0f;
state
= 0;
invalidate();
}
}
}
else if (event
.getPointerCount() > 1) {
float x0
= event
.getX(0);
float x1
= event
.getX(1);
float y0
= event
.getY(0);
float y1
= event
.getY(1);
double news
= Math
.sqrt(Math
.pow(x0
- x1
, 2) + Math
.pow(y0
- y1
, 2));
if (event
.getAction() == event
.ACTION_MOVE
) {
if (news
> old
&& x
< 4) {
x
+= 0.01;
y
+= 0.01;
}
else if (news
< old
&& x
> 0.05) {
x
-= 0.01;
y
-= 0.01;
}
invalidate();
}
old
= news
;
}
return true;
}
}
使用:
1.在Activity里直接布局
<?xml version
="1.0" encoding
="utf-8"?>
<LinearLayout xmlns
:android
="http://schemas.android.com/apk/res/android"
xmlns
:app
="http://schemas.android.com/apk/res-auto"
xmlns
:tools
="http://schemas.android.com/tools"
android
:layout_width
="match_parent"
android
:layout_height
="match_parent"
android
:background
="#fff"
android
:orientation
="vertical"
tools
:context
=".work7.Main7Activity">
<com
.example
.sirl
.demo0711
.work7
.MyView
android
:id
="@+id/mv"
android
:layout_width
="match_parent"
android
:layout_height
="match_parent" />
</LinearLayout
>
2.因为该控件继承ImageView,直接放入图片即可
public class Main7Activity extends AppCompatActivity {
MyView myView
;
@Override
protected void onCreate(Bundle savedInstanceState
) {
super.onCreate(savedInstanceState
);
setContentView(R
.layout
.activity_main7
);
myView
=findViewById(R
.id
.mv
);
myView
.setImageResource(R
.mipmap
.ic_launcher
);
}
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-31126.html