我可以覆盖外部库中的方法吗?

时间:2019-02-09 18:05:16

标签: java android

我对类人动物很新鲜,所以寻求建议。

我正在尝试制作2个可缩放的imageViews。因此,我实现了https://github.com/chrisbanes/PhotoView库,该库使imageView完全可缩放,双击缩放等。

我要做出的关键思想是从一个图像复制手势,然后将这些手势应用于另一个图像(例如,如果第一个图像正在缩放,我希望另一个图像完全一样缩放)。这样做的逻辑方法是为photoView(来自库的imageView)编写setOnTouchListener,并在onTouch方法中调用其他图像视图并为其分配dispachTouchEvent。但是编写setOnTouchListener要求重写onTouch方法,这会使photoView的功能失效。

所以我的问题是,我什至可以覆盖库mathods吗?或者,如果可以的话,那可能是我的缺点,那就是我失去了所有功能吗?如果我不能这样做,你们还有其他建议如何将手势从一个imageView复制到另一个?还是可以与其他可缩放图像库一起使用?使用外部库的主要目的不是重新发明整个可缩放的imageView。

谢谢!

PhotoView image = findViewById(R.id.photo); 
PhotoView image2 = findViewById(R.id.photo2);

image.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) { 
            image2.dispatchTouchEvent(motionEvent);
            return false;
        }
    });

2 个答案:

答案 0 :(得分:3)

您不能直接在外部库中重写方法。

但是,如果您要覆盖的方法的类不是 final,而您要覆盖的方法的不是 final,那么您可以创建该类的子类。

例如,如果PhotoView不是标有final的课程,我可以创建以下内容:

public class CustomPhotoView extends PhotoView {

    @Override
    public void setOnTouchListener(OnTouchListener l) {
        super.setOnTouchListener(l);
        //Do stuff
    } 
}

从本质上讲,这与通过将其他ImageView的其他子视图创建子类来创建自己的自定义视图时相同。

但是,您还可以创建PhotoView的分支或副本,并直接对PhotoView进行更改。之后,您将使用自己的PhotoView实现而不是Chris Banes的实现。

答案 1 :(得分:0)

由于Java类加载器的工作方式,还有另一个选择可以实现您想要的。但是在此之前,您需要检查要更改的库的许可证(如果有)。如果您具有类的源代码,则可以在项目中创建与要更改的类完全相同的完整类名的类。然后在您的项目的该类中编写代码。而且,当您启动应用程序时,Java类加载器将使用代码而不是库中的类从项目中加载类。即使库中的类是最终的,或者您要覆盖的方法是最终的,这种方法也可以使用。