5

カスタム線形レイアウトクラスを使用している小さなAndroidアプリケーションを開発しています。そのクラスでは、1つの小さな三角形を描画して、それを線形レイアウトに含めようとしましたが、それはできません。私は次の方法でそれを試しました...

@SuppressLint("DrawAllocation")
public class SimpleLin extends LinearLayout {
    public String TAG = "CustomviewActivity";   
    LinearLayout parentLayout;

    public SimpleLin(Context context) 
    {
        super(context);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(inflater != null){   
        view = inflater.inflate(R.layout.main2, this);d.lin_llt);
        parentLayout.setBackgroundResource(R.drawable.bcd);

      }

    }

    public SimpleLin(Context context, AttributeSet attrs) {

        super( context, attrs );

        context1= context;
    }

    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);
        Log.i("############################", "inside ondraw");
        Paint p = new Paint();
        p.setStyle(Style.FILL);
        p.setColor(Color.RED);
        Point point = new Point();
        point.x = 80;
        point.y = 80;
        Path path = getEquilateralTriangle(point, 70, Direction.SOUTH);
        Bitmap b = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
        canvas.drawPath(path, p);
    }
    public static Path getEquilateralTriangle(Point p1, int width, Direction direction) {
        Point p2 = null, p3 = null;

        if (direction == Direction.NORTH) {
            p2 = new Point(p1.x + width, p1.y);
            p3 = new Point(p1.x + (width / 2), p1.y - width);
        }
        else if (direction == Direction.SOUTH) {
            p2 = new Point(p1.x + width,p1.y);
            p3 = new Point(p1.x + (width / 2), p1.y + width);
        }
        else if (direction == Direction.EAST) {
            p2 = new Point(p1.x, p1.y + width);
            p3 = new Point(p1.x - width, p1.y + (width / 2));
        }
        else if (direction == Direction.WEST) {
            p2 = new Point(p1.x, p1.y + width);
            p3 = new Point(p1.x + width, p1.y + (width / 2));
        }

        Path path = new Path();
        path.moveTo(p1.x, p1.y);
        path.lineTo(p2.x, p2.y);
        path.lineTo(p3.x, p3.y);

        return path;
    }
    public enum Direction 
    {
        NORTH, SOUTH, EAST, WEST;
    }

    @SuppressWarnings("deprecation")
    public void initialiseImages()
    {
        invalidate();
    }
}

initialiseImagesこのカスタムレイアウトを使用したいアクティビティからメソッドを呼び出しています。したがって、問題は、invalidate()を使用すると、ondrawメソッドが呼び出されないことです。だから私の三角形を描かないのです。そして、私はその三角形を私の中に含める方法も混乱してparentlayoutいます..私のコードに間違っていますか..アンドロイドでそのような形を描く方法...助けが必要です...ありがとう...

4

2 に答える 2

11

カスタム線形レイアウトのコード (コードを変更して、理解しやすくしました)

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.LinearLayout;

/**
 * @author Atrix1987
 * 
 */
public class CustomView extends LinearLayout {

    /**
     * @param context
     */
    public CustomView(Context context) {
        super(context);
        commonConstructor(context);
    }

    /**
     * @param context
     * @param attrs
     */
    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        commonConstructor(context);
    }

    /**
     * 
     */
    Paint trianglePaint;
    /**
     * 
     */
    Path trianglePath;

    /**
     * @param context
     */
    private void commonConstructor(Context context) {
        trianglePaint = new Paint();
        trianglePaint.setStyle(Style.FILL);
        trianglePaint.setColor(Color.RED);
        Point point = new Point();
        point.x = 80;
        point.y = 80;
        trianglePath = getEquilateralTriangle(point, 70, Direction.SOUTH);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        Log.i("Sample", "inside ondraw");
        //avoid creating objects in onDraw
        canvas.drawPath(trianglePath, trianglePaint);
    }

    private Path getEquilateralTriangle(Point p1, int width, Direction direction) {
        Log.i("Sample", "inside getEqui");
        Point p2 = null, p3 = null;

        if (direction == Direction.NORTH) {
            p2 = new Point(p1.x + width, p1.y);
            p3 = new Point(p1.x + (width / 2), p1.y - width);
        } else if (direction == Direction.SOUTH) {
            p2 = new Point(p1.x + width, p1.y);
            p3 = new Point(p1.x + (width / 2), p1.y + width);
        } else if (direction == Direction.EAST) {
            p2 = new Point(p1.x, p1.y + width);
            p3 = new Point(p1.x - width, p1.y + (width / 2));
        } else if (direction == Direction.WEST) {
            p2 = new Point(p1.x, p1.y + width);
            p3 = new Point(p1.x + width, p1.y + (width / 2));
        }

        Path path = new Path();
        path.moveTo(p1.x, p1.y);
        path.lineTo(p2.x, p2.y);
        path.lineTo(p3.x, p3.y);

        return path;
    }

    public enum Direction {
        NORTH, SOUTH, EAST, WEST;
    }

}

アクティビティのコード (簡単にするため、ショートカットとしてこれを行いました。xml で指定して、setContentView だけにすることもできます):

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

/**
 * @author Atrix1987
 *
 */
public class SampleActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        CustomView cv = new CustomView(getApplicationContext());
        cv.setBackgroundColor(Color.WHITE);
        setContentView(cv, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    }

}

詳細については、カスタム ビューの開発者サイトリンクを参照してください。

お役に立てれば。

PFB スクリーンショット私が実行したサンプルのスクリーンショット

于 2013-03-01T06:12:56.387 に答える
4

使用できるドローアブルが必要な場合は、これを試してください http://looksok.wordpress.com/2013/08/24/android-triangle-arrow-defined-as-an-xml-shape/悲しいことに私は主張できませんクレジット

于 2013-09-27T16:26:08.660 に答える