捏合缩放和平移

2023-12-31

我有一个以 LinearLayout 作为主要布局的活动。在该布局中,有一个按钮可将视图 (R.layout.motor_block) 添加到主布局 (R.id.layout):

    LayoutInflater inflater =
    (LayoutInflater)this.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
    View iv = inflater.inflate( R.layout.motor_block, null );
    RelativeLayout rl = (RelativeLayout) findViewById(R.id.layout);
    rl.addView(iv);

这工作正常,但是当我添加更多视图时,屏幕会被它们填满,因此我需要一种通过添加平移来“扩展”大小的方法,以便我可以浏览所有视图。 我还想添加缩放功能。

我尝试使用 WebView:

       RelativeLayout rl = (RelativeLayout) findViewById(R.id.layout);
   WebView wv = (WebView) findViewById(R.id.webView1);
   wv.getSettings().setSupportZoom(true);  
   wv.getSettings().setBuiltInZoomControls(true);
   wv.getSettings().setUseWideViewPort(true);
   wv.getSettings().setLoadWithOverviewMode(true);
   wv.getSettings().setDisplayZoomControls(false);
   wv.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
   wv.addView(iv);

视图被添加到其中,并且平移可以工作。问题是,当我缩放时,webView 会缩放背景,而 View 不会改变大小。

我还尝试了一些自定义视图,但它们不支持带有子视图的视图。

实现这一目标的最佳方法是什么?


只是一个例子。在主容器视图上使用 setTranslationX/Y 和 setScaleX/Y。它的子级将随之缩放和翻译。

public class MainActivity extends Activity {

    private RelativeLayout mainLayout;
    private ScaleGestureDetector scaleGestureDetector;
    private float scale = 1;
    private PointF touchPoint;
    private PointF pan;

    private boolean isScaling;
    private boolean endScalingNextUp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainLayout = (RelativeLayout) findViewById(id.main_layout);
        scaleGestureDetector = new ScaleGestureDetector(this, new ExampleScaleGestureListener());
        Button b = ((Button) findViewById(id.btn_reset));
        b.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                reset();
            }
        });
        reset();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        scaleGestureDetector.onTouchEvent(event);

        if (scale != 1 && !isScaling) {
            float x = event.getRawX();
            float y = event.getRawY();
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                touchPoint = new PointF(x, y);
            } else if (event.getAction() == MotionEvent.ACTION_MOVE && touchPoint != null) {
                pan.x = x - touchPoint.x;
                pan.y = y - touchPoint.y;
                panView();
            }
        }
        if (isScaling && endScalingNextUp) {
            if (event.getAction() == MotionEvent.ACTION_POINTER_UP) {
                endScalingNextUp = false;
                isScaling = false;
            }
        }

        return true;
    }

    private void setPivot(float focusX, float focusY) {
        mainLayout.setPivotX(focusX);
        mainLayout.setPivotY(focusY);
    }

    private void scaleView() {
        mainLayout.setScaleX(scale);
        mainLayout.setScaleY(scale);
    }

    private void panView() {
        mainLayout.setTranslationX(pan.x);
        mainLayout.setTranslationY(pan.y);
    }

    private void reset() {
        setPivot(0, 0);
        scale = 1;
        scaleView();
        pan = new PointF(0, 0);
        panView();
        isScaling = false;
    }

    private class ExampleScaleGestureListener implements OnScaleGestureListener {

        private static final float SCALE_SPEED = .02f;

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            endScalingNextUp = true;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            float focusX = detector.getFocusX();
            float focusY = detector.getFocusY();
            setPivot(focusX, focusY);
            isScaling = true;
            endScalingNextUp = false;
            return true;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            isScaling = true;
            endScalingNextUp = false;
            if (detector.getScaleFactor() < 1) {
                scale -= SCALE_SPEED;
            } else if (detector.getScaleFactor() > 1) {
                scale += SCALE_SPEED;
            }
            scaleView();
            return true;
        }
    }
}


    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        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"
        android:id="@+id/main_layout"
        tools:context=".MainActivity" >

        <TextView
            android:id="@+id/tv"
            android:layout_centerInParent="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/tv"
            android:layout_marginBottom="69dp"
            android:layout_marginRight="29dp"
            android:layout_toLeftOf="@+id/tv"
            android:src="@drawable/ic_launcher" />

        <Button
            android:id="@+id/btn_reset"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tv"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="22dp"
            android:text="Reset" />

    </RelativeLayout>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捏合缩放和平移 的相关文章

随机推荐

  • 使用 MockMvc 测试重定向 URL 的 HTTP 状态代码

    我想使用 MockMvc 在 Spring Boot 应用程序中测试登录过程 成功登录后 用户将被重定向到 home 为了测试这一点 我使用 Test public void testLogin throws Exception Reque
  • 数据结构中的自引用 - 检查相等性

    在我最初尝试创建不相交集数据结构时 我创建了一个Point数据类型与parent指向另一个的指针Point data Point a Point value a parent Point a rank Int 要创建单例集 Point创建它
  • 捕获所有无效 URL

    我最近升级了一个网站 几乎所有 URL 都发生了变化 我已经重定向了所有这些 或者我希望如此 但其中一些可能已经被我忽略了 有没有办法以某种方式捕获所有无效 URL 并将用户发送到某个页面 并以某种方式知道该人来自哪个 URL 以便我可以记
  • 在 TextMate 中,我无法使用 Rails tmbundle 创建部分

    Applications TextMate app Contents SharedSupport Support lib ui rb 355 in to plist An object in the argument tree could
  • PyCharm 能否以正确的顺序显示变量的字段?

    我定义了一个有几个字段的数据类 当我打印它时 它们以正确的顺序显示 def test dataclass class Image width int height int pixels object image Image width 4
  • 多线程感知模式下的 BOOST 库

    可以在所谓的线程感知模式下编译 BOOST 库 如果是这样 您将看到 mt 出现在库名称中 我不明白它给了我什么以及我什么时候需要使用这种模式 它给我带来任何好处吗 更重要的是 我对在无线程感知机制中编译 BOOST Threads 库 名
  • 如何使react swiper在垂直方向滑动

    我想让主页就像我可以在莫伊莱视图中一次滑动一篇文章一样 我尝试过反应滑动器 但反应滑动器正在水平滑动帖子 我想垂直滑动帖子 知道如何制作吗 你可以给它方向 只需像这样添加方向道具
  • python有比较和交换操作吗

    试图找到python是否支持CAS操作 无锁编程 像java中的并发 Python没有这些操作 Java 具有比 Python 更复杂的并发控制 CPython 几乎每个人都使用的典型实现 有一个您需要了解的全局解释器锁 Jython 是
  • Groovy 安全取消引用运算符 (?.) 的最佳 Scala 模仿?

    我想知道 Groovy 的最好的 Scala 模仿是什么安全取消引用运算符 http groovy codehaus org Null Object Pattern 或者至少有一些接近的替代品是 I ve 简要讨论一下 http www c
  • 带/多个条件赋值

    让我们来一个M 10 x 4 x 12 矩阵 作为例子 我以M 4 val 4 0 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1
  • 访问未定义的子类型时自定义编译错误消息

    我有一些类型 其中每个类型都有相同名称的子类型 struct TypeA typedef int subtype struct TypeB typedef float subtype 以及没有此子类型但在同一上下文中使用的类型 struct
  • 如何以声明方式使用数据绑定参数创建 RouteUrls?

    我正在使用 ASP NET 4 中的新路由功能 Web 表单 而不是 MVC 现在我有一个绑定到数据源的 asp ListView 其中一个属性是ClientID我想用它从 ListView 项目链接到另一个页面 在global asax我
  • 使用 Picasso 和自定义 Transform 对象加载大图像

    从 Android Gallery 使用 startActivityForResult 加载 大 图像 gt 1 5MB 时 我使用 Picasso 遇到内存不足异常 我使用自定义 Target 对象 因为我需要在位图准备就绪时对其进行预处
  • 城市街道的程序生成?

    我读过 L Systems Parish Muller 和 Kelly McCabe 并尝试实施this https stackoverflow com questions 12956334 how is l systems for roa
  • Coldfusion 为某些类添加 id

    目前我有一堆 HTML 存储在一个变量中 我将其输出到看起来有点像这样的页面 p class firstpara some stuff p p class subhead a heading p p class subsubhead a s
  • 处理 Silverlight 单元测试中的依赖对象

    一段时间以来 我一直在使用 NUnit 和 Moq 以及 Silverlight 代码编写单元测试 我一直遇到的一个问题与 DependencyObjects 有关 如果有任何东西是从 DependencyObject 派生的 那么我无法在
  • 理解和调试 `asyncio.TimeoutError from None` 错误

    我遇到了 aiohttp 的问题 出现以下错误 但不确定修复它的最佳方法 Traceback most recent call last File app app services file ingestion utils py line
  • 检查文件是否包含某些内容

    感谢之前的回答 我可以使用以下命令测试文件是否存在 if empty glob filename endif 我现在想检查该文件是否filename包含文本text 如果可能的话 我想仅使用本机 vimscript 来执行此操作 而不是调用
  • 如何覆盖 Firefox 插件中内置的 XPCOM 组件?

    我第一次涉足 Firefox 扩展开发 到目前为止进展顺利 但我遇到了一个问题 我需要做的一件事是覆盖内置的 nsIPromptService 并用我自己的东西替换它 我在这里完成了基本的 XPCOM 组件创建教程 并让 hello wor
  • 捏合缩放和平移

    我有一个以 LinearLayout 作为主要布局的活动 在该布局中 有一个按钮可将视图 R layout motor block 添加到主布局 R id layout LayoutInflater inflater LayoutInfla