如何向下转换自定义视图以使用上下文菜单

时间:2018-07-12 15:29:18

标签: java android

当用户在我的自定义视图中保存某些内容时,我试图使用上下文菜单弹出一些选项。

现在我的自定义视图扩展了View,所以我不明白为什么我无法让registerForContextMenu()起作用。

在我的活动中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_select);

    photoSorter = (PhotoSortrView) findViewById(R.id.photosortr);
    //View sorterView = (View)photoSorter;
    registerForContextMenu(photeSorter); //tried using sorterView as well
}

我像正常情况一样调用上下文菜单(它也适用于我为其分配的其他任何内容)

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenu.ContextMenuInfo menuInfo) {
    Log.d("PRESS","OnCreatContextMenu");
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}

作为参考,这是我的自定义View类:

public class PhotoSortrView extends View implements

    MultiTouchObjectCanvas<MultiTouchEntity> {

private Path drawPath;
private Paint drawPaint, canvasPaint;
private int paintColor = Color.TRANSPARENT ;
private Canvas drawCanvas;
private Bitmap canvasBitmap;
private ArrayList<MultiTouchEntity> imageIDs = new ArrayList<MultiTouchEntity>();
private MultiTouchController<MultiTouchEntity> multiTouchController = new MultiTouchController<MultiTouchEntity>(
        this);
private PointInfo currTouchPoint = new PointInfo();
private boolean mShowDebugInfo = true;
private static final int UI_MODE_ROTATE = 1, UI_MODE_ANISOTROPIC_SCALE = 2;
private int mUIMode = UI_MODE_ROTATE;
private static final float SCREEN_MARGIN = 100;
private int width, height, displayWidth, displayHeight;

public PhotoSortrView(Context context) {
    this(context, null);
}

public PhotoSortrView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
    setupDrawing();
}

public PhotoSortrView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

private void init(Context context) {
    Resources res = context.getResources();
    setBackgroundColor(Color.TRANSPARENT);

    DisplayMetrics metrics = res.getDisplayMetrics();
    this.displayWidth = res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? Math
            .max(metrics.widthPixels, metrics.heightPixels) : Math.min(
            metrics.widthPixels, metrics.heightPixels);
    this.displayHeight = res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? Math
            .min(metrics.widthPixels, metrics.heightPixels) : Math.max(
            metrics.widthPixels, metrics.heightPixels);
}

public void addImages(Context context, Bitmap bitmap) {
    imageIDs.add(new ImageEntity(bitmap));
    float cx = getWidth() / 2;
    float cy = getHeight() / 2;
    imageIDs.get(imageIDs.size() - 1).load(context, cx, cy);
    invalidate();
}

public void removeAllImages() {
    imageIDs.removeAll(imageIDs);
    invalidate();
}

public void removeImage() {
    // Resources res = context.getResources();
    // int n = imageIDs.size();
    // for (int i = 0; i < n; i++)
    if (imageIDs.size() > 0) {
        imageIDs.remove(imageIDs.size() - 1);
    }

    invalidate();
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.drawPath(drawPath, drawPaint);
    int n = imageIDs.size();
    for (int i = 0; i < n; i++)
        imageIDs.get(i).draw(canvas);
}

/** Pass touch events to the MT controller */
@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    // respond to down, move and up events
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        //handler.postDelayed(mLongPressed, ViewConfiguration.getLongPressTimeout());
        drawPath.moveTo(touchX, touchY);
        break;
    case MotionEvent.ACTION_MOVE:
        drawPath.lineTo(touchX, touchY);
        break;
    case MotionEvent.ACTION_UP:
        drawPath.lineTo(touchX, touchY);
        drawCanvas.drawPath(drawPath, drawPaint);
        drawPath.reset();
        break;
    default:
        return false;
    }
    return multiTouchController.onTouchEvent(event);
}

public MultiTouchEntity getDraggableObjectAtPoint(PointInfo pt) {
    float x = pt.getX(), y = pt.getY();
    int n = imageIDs.size();
    for (int i = n - 1; i >= 0; i--) {
        ImageEntity im = (ImageEntity) imageIDs.get(i);
        if (im.containsPoint(x, y))
            return im;
    }
    return null;
}
public void selectObject(MultiTouchEntity img, PointInfo touchPoint) {
    currTouchPoint.set(touchPoint);
    if (img != null) {
        // Move image to the top of the stack when selected
        drawPaint.setColor(Color.TRANSPARENT);
        imageIDs.remove(img);
        imageIDs.add(img);
        Log.d("PRESS", "Select Object");
    } else {
    }
    invalidate();
}

public void getPositionAndScale(MultiTouchEntity img,
    objPosAndScaleOut.set(img.getCenterX(), img.getCenterY(),
            (mUIMode & UI_MODE_ANISOTROPIC_SCALE) == 0,
            (img.getScaleX() + img.getScaleY()) / 2,
            (mUIMode & UI_MODE_ANISOTROPIC_SCALE) != 0, img.getScaleX(),
            img.getScaleY(), (mUIMode & UI_MODE_ROTATE) != 0,
            img.getAngle());
}

public boolean setPositionAndScale(MultiTouchEntity img,
        PositionAndScale newImgPosAndScale, PointInfo touchPoint) {
    currTouchPoint.set(touchPoint);
    boolean ok = ((ImageEntity) img).setPos(newImgPosAndScale);
    if (ok)
        invalidate();
    return ok;
}

public boolean pointInObjectGrabArea(PointInfo pt, MultiTouchEntity img) {
    return false;
}

private void setupDrawing() {

    drawPath = new Path();
    drawPaint = new Paint();
    drawPaint.setColor(paintColor);
    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(10);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);
    canvasPaint = new Paint(Paint.DITHER_FLAG);

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    if (w > 0 && h > 0) {

        super.onSizeChanged(w, h, oldw, oldh);
        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);
    }
}

public Bitmap fetchCanvas(){
    return canvasBitmap;
}

public void setColor(String newColor) {
    invalidate();
    paintColor = Color.parseColor(newColor);
    drawPaint.setColor(paintColor);
}

public void clearCanvas() {
    drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
    invalidate();

}

public void setTranspertColor() {
    drawPaint.setColor(Color.TRANSPARENT);
}
}

0 个答案:

没有答案