我有ImageView
我可以用来放大图像,但我无法让图像滚动。通过查看我的代码,有人能告诉我我做错了什么吗?
这是我的activity_route_detail.xml
ImageView
我试图滚动:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/activity_route_details"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.zach.listview.RouteDetails">
<TextView
android:text="TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/routeDetailsView"
android:textSize="18sp"
android:textAlignment="center"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/routeImage"
android:scaleType="matrix"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
这是我的routeDetails.java
,其中包含滚动码:
package com.example.zach.listview;
import android.graphics.Matrix;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class RouteDetails extends AppCompatActivity {
Matrix matrix = new Matrix();
Float scale = 1f;
ScaleGestureDetector SGD;
ImageView routeImage;
//variables for scrolling
float curX, curY;
float mx;
float my;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_route_details);
//back button for route details view
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//TextView for route details
final TextView routeDetailsView = (TextView) findViewById(R.id.routeDetailsView);
routeDetailsView.setText(getIntent().getExtras().getString("route"));
//ImageView for route details
routeImage = (ImageView) findViewById(R.id.routeImage);
routeImage.setImageResource(getIntent().getIntExtra("imageResourceId", 0));
///// scrolling listener code
routeDetailsView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mx = event.getX();
my = event.getY();
break;
case MotionEvent.ACTION_MOVE:
curX = event.getX();
curY = event.getY();
routeDetailsView.scrollBy((int) (mx - curX), (int) (my - curY));
mx = curX;
my = curY;
break;
case MotionEvent.ACTION_UP:
curX = event.getX();
curY = event.getY();
routeDetailsView.scrollBy((int) (mx - curX), (int) (my - curY));
break;
}
return true;
}
});
/////
SGD = new ScaleGestureDetector(this, new ScaleListener());
}
//listener for pinch zoom
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
scale = scale * detector.getScaleFactor();
scale = Math.max(0.1f, Math.min(scale, 5f));
matrix.setScale(scale, scale);
routeImage.setImageMatrix(matrix);
return true;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
SGD.onTouchEvent(event);
return true;
}
//back button for route details view
@Override
public boolean onSupportNavigateUp() {
finish();
return true;
}
}
答案 0 :(得分:0)
ImageView
不会将自身变为滚动视图。
您必须使用矩阵本身将缩放的ImageView
移动到所需的位置,如下所示:
matrix.setScale(scale, scale)
matrix.postTranslate(curX - mx, curY - my);
routeImage.setImageMatrix(matrix);
然后你还需要做两件事:
您需要跟踪当前使用的比例因子,以便将矩阵设置为适当的比例值以及转换值。
您需要进行一些边界检查,以便在用户尝试在视图范围内滚动图像时,您可以调整滚动以使图像保持在视图范围内,这样您就不会变大空的空间。警告:进行所有检查和调整是正确的痛苦。我写了其中一个缩放组件,并不像听起来那么简单。
此外,我注意到您在matrix.setScale(scale, scale)
中呼叫ScaleListener
。为了使刻度与滚动同步,您应该在探测器上调用getFocusX()
和getFocusY()
,然后就可以了
matrix.setScale(scale, scale, focusX, focusY)
这给你带来了额外的挑战,即找出当前图像边界与视图边界的关系。我保留了Rect
图片的原始尺寸,并在缩放后使用matrix.mapRect()
来获取更新的图像边界。当然,您必须对视图内部的图像边缘进行相同的边界检查和调整。
GitHub上有大量这些图像视图实现。你可以节省一些时间和时间。通过搜索GitHub的“触摸图像视图”或“缩放图像视图”并使用预编码(并且有希望预先测试)的组件来实现痛苦。