2012-07-15 25 views
5

Tôi đang cố gắng vẽ một đường trong một tùy chỉnh View. Ở đây tôi đã tạo ra một đơn giản Path chỉ với một đoạn duy nhất, tạo ra một PathShape từ đó, và cuối cùng bị mắc kẹt vào một ShapeDrawable với ý định sử dụng để vẽ trênbên trong onDraw(). Tuy nhiên, điều này không hoạt động. Xem ví dụ của tôi ở đây.Bạn định sử dụng ShapeDrawable bằng PathShape để vẽ một đường trên Chế độ xem tùy chỉnh như thế nào?

package com.example.test; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.drawable.ShapeDrawable; 
import android.graphics.drawable.shapes.PathShape; 
import android.util.Log; 
import android.view.View; 

public class TestView extends View { 

    private Path mPath = null; 
    private Paint mPaint = null; 
    private PathShape mPathShape = null; 
    private ShapeDrawable mShapeDrawable = null; 

    public TestView(Context context) { 
     super(context); 
    } 

    private void init() { 
     int width = this.getWidth()/2; 
     int height = this.getHeight()/2; 

     Log.d("init", String.format("width: %d; height: %d", width, height)); 

     this.mPath = new Path(); 
     this.mPath.moveTo(0, 0); 
     this.mPath.lineTo(width, height); 

     this.mPaint = new Paint(); 
     this.mPaint.setColor(Color.RED); 

     this.mPathShape = new PathShape(this.mPath, 1, 1); 

     this.mShapeDrawable = new ShapeDrawable(this.mPathShape); 
     this.mShapeDrawable.getPaint().set(this.mPaint); 
     this.mShapeDrawable.setBounds(0, 0, width, height); 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 

     // Doing this here because in the constructor we don't have the width and height of the view, yet 
     this.init(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     Log.d("onDraw", "Drawing"); 

     // This works, but won't let me do what I'm really trying to do 
     canvas.drawLine(0.0f, 0.0f, this.getWidth()/2.0f, this.getHeight()/2.0f, this.mPaint); 

     // This should work, but does not 
     //this.mPathShape.draw(canvas, this.mPaint); 

     // This should work, but does not 
     //this.mShapeDrawable.draw(canvas); 
    } 

} 

Như bạn có thể nhìn thấy từ ý kiến ​​của tôi trong phương pháp onDraw(), không sử dụng PathShape lẫn ShapeDrawable để vẽ Path vào Canvas thực sự hoạt động. Không có gì được rút ra khi tôi cố gắng. Có ai có bất kỳ ý tưởng tại sao?

Thiết bị tôi đang thử nghiệm này đang chạy Android 4.1.1.

+0

Chỉ cần tò mò - bạn đã thử tạo một đối tượng Paint mới bên trong onDraw chưa. Tôi đang làm điều đó và thành công với bitmap nhưng không chắc liệu nó có cần thiết hay không. – JavaCoderEx

+0

Tôi đã không, vì tôi không muốn tạo ra các đối tượng trong onDraw (nó thực sự gây ra một cảnh báo từ Lint). Tuy nhiên, tôi đã thử nó ngay bây giờ và có kết quả tương tự. Không thành công. – Daniel

+0

Sau khi một số điều tra thêm, và thiếu phản ứng ở đây, tôi nghĩ rằng điều này chỉ đơn giản là bị hỏng và tôi đã gửi một báo cáo lỗi. http://code.google.com/p/android/issues/detail?id=35229 – Daniel

Trả lời

12

Có hai vấn đề với điều này.

Đầu tiên là kiểu Paint. Mặc định là Paint.Stroke.FILL, nhưng với một dòng không có gì để điền vào. Tôi cần thiết để thêm video này (nhờ, Romain Guy):

this.mPaint.setStyle(Paint.Style.STROKE); 

Vấn đề thứ hai là chiều cao tiêu chuẩn và chiều rộng trong PathShape là không đúng. Tôi đã đọc the documentation về điều này, nhưng không hiểu chính xác. Điều này trở nên rõ ràng khi tôi đã khắc phục vấn đề đầu tiên. Đặt nó thành chiều cao và chiều rộng của chế độ xem tùy chỉnh của tôi (vì tôi đang vẽ trên toàn bộ chế độ xem) đã sửa lỗi này. Tôi cũng phải thay đổi các giới hạn của ShapeDrawable để khớp.

this.mPathShape = new PathShape(this.mPath, this.getWidth(), this.getHeight()); 

this.mShapeDrawable.setBounds(0, 0, this.getWidth(), this.getHeight()); 

Hy vọng rằng đây sẽ giúp người khác trong tương lai.

+0

Cảm ơn vì điều này! Tôi có cùng một vấn đề. –

+1

Một vấn đề khác có thể khiến nó không xuất hiện là nếu kích thước đường dẫn của bạn lớn hơn tỷ lệ khung hình tối đa, dẫn đến cảnh báo trong LogCat của bạn. –

Các vấn đề liên quan