пользовательский вид изображения для Android

1

Мое пользовательское представление выглядит как ниже


package com.mypackage;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RectShape;
import android.widget.ImageView;

public class CustomDrawableView extends ImageView {
    // private ShapeDrawable mDrawable;
    public int imageid = 0;
    ShapeDrawable bgDrawable = null;
    List<ShapeDrawable> ls = new ArrayList<ShapeDrawable>();
    final int COUNT_SUMMERY = 3;
    final int VERTICAL_OFFSET = 200;
    final int HORIZENTAL_OFFSET = 20;
    final int HORIZENTAL_GAP = 85;
    final int VERTICAL_Y_POINT = 15;
    final int VERTICAL_MAX_HEIGHT = 195;
    final int HORIZENTAL_WIDTH = 60;
    final int percentage[] = {25, 40, 35};
    public CustomDrawableView(Context context, int id) {
        super(context);

        imageid = id;

        switch(id) {
        case R.drawable.summarychart:
            for(int i = 0; i < COUNT_SUMMERY; i++) {
                int x = HORIZENTAL_OFFSET + (HORIZENTAL_GAP * i);
                int width = HORIZENTAL_WIDTH;
                int height = VERTICAL_MAX_HEIGHT * percentage[i] / 100;
                int y = VERTICAL_OFFSET + VERTICAL_Y_POINT + VERTICAL_MAX_HEIGHT - height;

                ShapeDrawable objDrawable = new ShapeDrawable(new RectShape());
                int color = 0; 
                switch(i) {
                case 0:
                    color = Color.RED;
                    break;
                case 1:
                    color = Color.GREEN;
                    break;
                case 2:
                    color = Color.YELLOW;
                    break;
                }
                objDrawable.getPaint().setColor(color);
                objDrawable.setBounds(x, y, x + width, y + height);
                ls.add(objDrawable);
            }
            break;
        default:
            break;
        }


        int x = 0;
        int y = 0;
        int width = 320;
        int height = 480;
        bgDrawable = new ShapeDrawable(new RectShape());
        bgDrawable.getPaint().setColor(0xffffffff);
        bgDrawable.setBounds(x, y, x + width, y + height);
    }

    protected void onDraw(Canvas canvas) {
/*      // Draw the white background
        // bgDrawable.draw(canvas);
        // Draw the bitmaps
        Bitmap bmp = BitmapFactory.decodeResource(getResources(), imageid);             
        canvas.drawBitmap(bmp, 0, VERTICAL_OFFSET, null);
*/        // Draw bars
        super.onDraw(canvas);

        for(int i = 0; i < COUNT_SUMMERY; i++) {
            ShapeDrawable objDrawable = ls.get(i);
            objDrawable.draw(canvas);
        }
    }
}

И в макете у меня есть:

<com.mypackage.CustomDrawableView
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:src="@drawable/mychart" />

Однако я вижу сообщение:

NoSuchMethodException: com.mypackage.CustomDrawableView. (Android.context.Context, Android.util.AttributeSet)

и если я попытаюсь запустить его, произойдет сбой приложения. Если я раскомментирую приемлемый способ, то он работает, но другие макеты не отображаются.

Любая помощь приветствуется.

Теги:
imageview

2 ответа

3

Вы можете исправить это, выполнив свой отсутствующий конструктор. Когда вы пытаетесь создать экземпляр из XML, он вызывается.

public CustomDrawableView(Context context, AttributeSet attrs) {
    super(context, attrs);
}
1

Все, что вам нужно сделать, это посмотреть на исключение, которое вы видите.

NoSuchMethodException:. Com.mypackage.CustomDrawableView(Android.context.Context, Android.util.AttributeSet)

Это означает, что нет метода с сигнатурой com.mypackage.CustomDrawableView.(Android.context.Context, Android.util.AttributeSet), потому что вы не переопределили его в своем классе.

  • 0
    да, это помогло, но вызывается метод ondraw, а затем рисуется макет, поэтому мои пользовательские графические элементы переопределяются обычным чертежом макета. есть метод с именем afterDraw?
  • 0
    Вы должны переопределить View не ImageView . Это должно решить проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню