编辑继承类的方法

时间:2015-05-12 21:03:36

标签: android inheritance seekbar

我想更改SeekBar's行为。因此,我需要在AbsSeekBar中编辑两个方法,其中一个受保护,另一个是

我该怎么做? 现在我不能简单地从AbsSeekbar复制所述方法并在我的自定义SeekBar类中覆盖它们 - 我最终错过了所有字段参数。 我也不能只编辑AbsSeekBar类本身,因为它不属于我的项目。任何帮助表示赞赏。 这是两种方法:

public abstract class AbsSeekBar extends ProgressBar {
.
.
.
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (!mIsUserSeekable || !isEnabled()) {
        return false;
    }

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (isInScrollingContainer()) {
                mTouchDownX = event.getX();
            } else {
                setPressed(true);
                if (mThumb != null) {
                    invalidate(mThumb.getBounds()); // This may be within the padding region
                }
                onStartTrackingTouch();
                trackTouchEvent(event);
                attemptClaimDrag();
            }
            break;

        case MotionEvent.ACTION_MOVE:
            if (mIsDragging) {
                trackTouchEvent(event);
            } else {
                final float x = event.getX();
                if (Math.abs(x - mTouchDownX) > mScaledTouchSlop) {
                    setPressed(true);
                    if (mThumb != null) {
                        invalidate(mThumb.getBounds()); // This may be within the padding region
                    }
                    onStartTrackingTouch();
                    trackTouchEvent(event);
                    attemptClaimDrag();
                }
            }
            break;

        case MotionEvent.ACTION_UP:
            if (mIsDragging) {
                trackTouchEvent(event);
                onStopTrackingTouch();
                setPressed(false);
            } else {
                // Touch up when we never crossed the touch slop threshold should
                // be interpreted as a tap-seek to that location.
                onStartTrackingTouch();
                trackTouchEvent(event);
                onStopTrackingTouch();
            }
            // ProgressBar doesn't know to repaint the thumb drawable
            // in its inactive state when the touch stops (because the
            // value has not apparently changed)
            invalidate();
            break;

        case MotionEvent.ACTION_CANCEL:
            if (mIsDragging) {
                onStopTrackingTouch();
                setPressed(false);
            }
            invalidate(); // see above explanation
            break;
    }
    return true;


private void trackTouchEvent(MotionEvent event) {
    final int width = getWidth();
    final int available = width - mPaddingLeft - mPaddingRight;
    final int x = (int) event.getX();
    float scale;
    float progress = 0;
    if (isLayoutRtl() && mMirrorForRtl) {
        if (x > width - mPaddingRight) {
            scale = 0.0f;
        } else if (x < mPaddingLeft) {
            scale = 1.0f;
        } else {
            scale = (float)(available - x + mPaddingLeft) / (float)available;
            progress = mTouchProgressOffset;
        }
    } else {
        if (x < mPaddingLeft) {
            scale = 0.0f;
        } else if (x > width - mPaddingRight) {
            scale = 1.0f;
        } else {
            scale = (float)(x - mPaddingLeft) / (float)available;
            progress = mTouchProgressOffset;
        }
    }
    final int max = getMax();
    progress += scale * max;

    setHotspot(x, (int) event.getY());
    setProgress((int) progress, true);
}

2 个答案:

答案 0 :(得分:0)

我不确定我理解'我最终错过了所有字段参数'

在Java中编辑方法功能的唯一方法是扩展类。

示例:

public class CustomSeekbar extends AbsSeekBar {
    public CustomSeekbar(Context context) {
        super(context);
    }

    @Override
    protected boolean verifyDrawable(Drawable who) {
        //Do your own method functionality
        //Return your own true/false
        return super.verifyDrawable(who);
    }
}

在这种情况下,如果您不想,则不必返回super.verifyDrawable,并且您可以提供自己的回复。

对于AbsSeekBar类中的所有protectedpublic方法都是如此。

通过反思,您可以修改课程的字段。

例如:

    Field drawableField = absSeekBarInstance.getClass().getField("mThumb");
    drawableField.setAccessible(true);
    drawableField.set(absSeekBarInstance, someDrawable);

或者要获取字段值,您只需说

    drawableField.get(absSeekBarInstance);

为了更进一步,您需要向我提供更多信息。

无法更改私有方法。这是不可能的。

Aspect-oriented programming in android

AspectJ很接近,但你不能做你所描述的。这就是Java的工作原理。在Objective-c中,你可以这样做,它被称为“混合”。

但是,在Java中,您无法更改已编译方法的功能。

您最好的选择是将AbsSeekBar及其所有必需的类复制到您自己的项目中。

答案 1 :(得分:0)

If you absolutely have to change how a private method works, you'll need to copy the entire class into your project, edit that copy, and use that version of the class instead of the original. Its something that should probably be avoided if possible.