如何同时缩放两个 ImageView?
How to zoom simultaneously on two ImageViews?
我想同时点击和缩放两个 ImageView。换句话说,我想缩放左视图并在另一个 ImageView 中看到完全相同的效果而没有任何延迟。
是否有图书馆已经这样做了?我环顾四周都没有成功:(
谢谢
如果您使用的是 Imageview,我建议您查看 Matrix.mapreact 并使用图像的 perticuler 矩阵
或
你也可以使用GestureImageView
public class SampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
GestureImageView view = new GestureImageView(this);
view.setImageResource(R.drawable.image);
view.setLayoutParams(params);
ViewGroup layout = (ViewGroup) findViewById(R.id.layout);
layout.addView(view);
}
}
实际上 library 您正在使用的
非常简单
布局activity_main
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingTop="30dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/photo1"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="1" />
<ImageView
android:id="@+id/photo2"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="1" />
</LinearLayout>
和里面的代码activity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView pic1 = (ImageView) findViewById(R.id.photo1);
ImageView pic2 = (ImageView) findViewById(R.id.photo2);
Drawable bitmap = getResources().getDrawable(R.mipmap.ic_launcher);
pic1.setImageDrawable(bitmap);
pic2.setImageDrawable(bitmap);
PhotoViewAttacher photoViewAttacher1 = new PhotoViewAttacher(pic1);
final PhotoViewAttacher photoViewAttacher2 = new PhotoViewAttacher(pic2);
photoViewAttacher1.setOnScaleChangeListener(new PhotoViewAttacher.OnScaleChangeListener() {
@Override
public void onScaleChange(float v, float v1, float v2) {
photoViewAttacher2.onScale(v, v1, v2);
}
});
}
结果:
为了真正让它工作(没有飞行......如果你能用飞行来做到这一点会很棒)我必须重写 PhotoViewAttacher 方法并将它们 link 在一起。实际上,我不希望只重新启动缩放选项,但也希望重新启动阻力。我是这样做的:
private boolean DEBUG = true;
private boolean actionL = false;
private boolean actionR = false;
private boolean scalingL = false;
private boolean scalingR = false;
//[...]
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
photoViewAttacherL = new PhotoViewAttacher(photoL){
@Override
public void onDrag(float dx, float dy) {
if (!scalingL && !actionL) {
actionL = true;
if (DEBUG) Dbg.d("DRAG", "x: " + dx + " y: " + dy);
photoViewAttacherR.onDrag(dx, dy);
super.onDrag(dx, dy);
actionL = false;
}
}
@Override
public void onFling(float startX, float startY, float velocityX, float velocityY) {
}
@Override
public boolean onTouch(View v, MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP){
scalingL = false;
scalingR = false;
}
return super.onTouch(v, ev);
}
@Override
public void onScale(float scaleFactor, float focusX, float focusY) {
if (!actionL) {
actionL = true;
if (DEBUG)
Dbg.d("SCALE", "factor: " + scaleFactor + " x: " + focusX + " y: " + focusY);
scalingL = true;
photoViewAttacherR.onScale(scaleFactor, focusX, focusY);
super.onScale(scaleFactor, focusX, focusY);
actionL = false;
}
}
};
photoViewAttacherR = new PhotoViewAttacher(photoR){
@Override
public void onDrag(float dx, float dy) {
if (!scalingR && !actionR) {
actionR = true;
if (DEBUG) Dbg.d("DRAG", "x: " + dx + " y: " + dy);
photoViewAttacherL.onDrag(dx, dy);
super.onDrag(dx, dy);
actionR = false;
}
}
@Override
public void onFling(float startX, float startY, float velocityX, float velocityY) {
}
@Override
public boolean onTouch(View v, MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP){
scalingL = false;
scalingR = false;
}
return super.onTouch(v, ev);
}
@Override
public void onScale(float scaleFactor, float focusX, float focusY) {
if (!actionR) {
actionR = true;
if (DEBUG)
Dbg.d("SCALE", "factor: " + scaleFactor + " x: " + focusX + " y: " + focusY);
scalingR = true;
photoViewAttacherL.onScale(scaleFactor, focusX, focusY);
super.onScale(scaleFactor, focusX, focusY);
actionR = false;
}
}
};
//[...]
}
我想同时点击和缩放两个 ImageView。换句话说,我想缩放左视图并在另一个 ImageView 中看到完全相同的效果而没有任何延迟。
是否有图书馆已经这样做了?我环顾四周都没有成功:(
谢谢
如果您使用的是 Imageview,我建议您查看 Matrix.mapreact 并使用图像的 perticuler 矩阵
或
你也可以使用GestureImageView
public class SampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
GestureImageView view = new GestureImageView(this);
view.setImageResource(R.drawable.image);
view.setLayoutParams(params);
ViewGroup layout = (ViewGroup) findViewById(R.id.layout);
layout.addView(view);
}
}
实际上 library 您正在使用的
非常简单布局activity_main
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingTop="30dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/photo1"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="1" />
<ImageView
android:id="@+id/photo2"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="1" />
</LinearLayout>
和里面的代码activity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView pic1 = (ImageView) findViewById(R.id.photo1);
ImageView pic2 = (ImageView) findViewById(R.id.photo2);
Drawable bitmap = getResources().getDrawable(R.mipmap.ic_launcher);
pic1.setImageDrawable(bitmap);
pic2.setImageDrawable(bitmap);
PhotoViewAttacher photoViewAttacher1 = new PhotoViewAttacher(pic1);
final PhotoViewAttacher photoViewAttacher2 = new PhotoViewAttacher(pic2);
photoViewAttacher1.setOnScaleChangeListener(new PhotoViewAttacher.OnScaleChangeListener() {
@Override
public void onScaleChange(float v, float v1, float v2) {
photoViewAttacher2.onScale(v, v1, v2);
}
});
}
结果:
为了真正让它工作(没有飞行......如果你能用飞行来做到这一点会很棒)我必须重写 PhotoViewAttacher 方法并将它们 link 在一起。实际上,我不希望只重新启动缩放选项,但也希望重新启动阻力。我是这样做的:
private boolean DEBUG = true;
private boolean actionL = false;
private boolean actionR = false;
private boolean scalingL = false;
private boolean scalingR = false;
//[...]
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
photoViewAttacherL = new PhotoViewAttacher(photoL){
@Override
public void onDrag(float dx, float dy) {
if (!scalingL && !actionL) {
actionL = true;
if (DEBUG) Dbg.d("DRAG", "x: " + dx + " y: " + dy);
photoViewAttacherR.onDrag(dx, dy);
super.onDrag(dx, dy);
actionL = false;
}
}
@Override
public void onFling(float startX, float startY, float velocityX, float velocityY) {
}
@Override
public boolean onTouch(View v, MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP){
scalingL = false;
scalingR = false;
}
return super.onTouch(v, ev);
}
@Override
public void onScale(float scaleFactor, float focusX, float focusY) {
if (!actionL) {
actionL = true;
if (DEBUG)
Dbg.d("SCALE", "factor: " + scaleFactor + " x: " + focusX + " y: " + focusY);
scalingL = true;
photoViewAttacherR.onScale(scaleFactor, focusX, focusY);
super.onScale(scaleFactor, focusX, focusY);
actionL = false;
}
}
};
photoViewAttacherR = new PhotoViewAttacher(photoR){
@Override
public void onDrag(float dx, float dy) {
if (!scalingR && !actionR) {
actionR = true;
if (DEBUG) Dbg.d("DRAG", "x: " + dx + " y: " + dy);
photoViewAttacherL.onDrag(dx, dy);
super.onDrag(dx, dy);
actionR = false;
}
}
@Override
public void onFling(float startX, float startY, float velocityX, float velocityY) {
}
@Override
public boolean onTouch(View v, MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP){
scalingL = false;
scalingR = false;
}
return super.onTouch(v, ev);
}
@Override
public void onScale(float scaleFactor, float focusX, float focusY) {
if (!actionR) {
actionR = true;
if (DEBUG)
Dbg.d("SCALE", "factor: " + scaleFactor + " x: " + focusX + " y: " + focusY);
scalingR = true;
photoViewAttacherL.onScale(scaleFactor, focusX, focusY);
super.onScale(scaleFactor, focusX, focusY);
actionR = false;
}
}
};
//[...]
}