2013-03-01 1 views
4

Я разрабатываю небольшое приложение для Android, в котором я использую свой собственный класс линейного макета. В этом классе я попытался нарисовать один маленький треугольник и попытался включить его в свой линейный макет, но я не смог этого сделать. Я попробовал его в следующих способов ...Как нарисовать треугольную форму и добавить ее в относительный или линейный макет андроида

@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 метод из моей деятельности, где я хотел бы использовать этот пользовательский макет. Поэтому проблема заключается в том, что он не вызывает мой метод draw при использовании invalidate(). Вот почему он не рисует мой треугольник. и я также путаю, как включить этот треугольник в мой parentlayout .. Есть неправильно в моем коде .. Как нарисовать такие фигуры в андроиде ... Нужна помощь ... Спасибо ...

+0

почему вам нужно Inflater в конструкторе? вы сказали, что вы просто пытаетесь нарисовать треугольник? – Atrix1987

+0

yeah becoz Я хотел добавить этот треугольник в эту линейную компоновку ... Любая идея .. Нужна помощь. – nilkash

+0

вам не нужно, вы расширяете линейную компоновку, затем вы раздуваете один раз, просматриваете ссылки dev для пользовательского представления, тем временем я получу вам пример кода – Atrix1987

ответ

11

кода для пользовательского Linear Layout (я изменил свой код, чтобы его проще для вас, чтобы понять)

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)); 
    } 

} 

Изучите сайт разработчика links для пользовательских представлений, чтобы узнать больше.

Надеюсь, это поможет.

PFB скриншот The screenshot from the sample i ran

+0

Да, я установил цвет фона в своем xml и его отлично работает – nilkash

Смежные вопросы