2012-07-07 29 views
9

tôi đang tìm cách để tái tạo sau đây trong ứng dụng của tôi:lệch một cái nhìn văn bản trong Android

enter image description here

Như bạn thấy, về cơ bản nó là một nút làm tăng/giảm giá trị của độ xem văn bản chứa bên trong nó. Nút này sẽ có ba trạng thái trực quan -> không nén, giảm và tăng (như được thấy trong hình trên, người dùng nhấn vào mũi tên tăng và nút xuất hiện được nhấn ở bên đó)

Dưới đây là 3 trạng thái nút hiện tại của tôi:

enter image description here enter image description here enter image description here

Như bạn có thể thấy, vấn đề tôi có là việc có thể để nghiêng một cách chính xác/xoay độ xem văn bản như vậy có vẻ trực quan chính xác và xuất hiện nghiêng cùng với các nút khi nó được tăng lên hay giảm.

Tôi đã thử hai cách tiếp cận khác nhau cho đến nay:

  • Tạo một lớp xem văn bản tùy chỉnh mà override phương thức onDraw() để nghiêng vải:

    @Override 
    public void onDraw(Canvas canvas) { 
        canvas.save(); 
    
        canvas.skew(0.2f, 0f); 
    
        super.onDraw(canvas); 
        canvas.restore(); 
    } 
    
  • Tích hợp Rotate3dAnimation lớp (nguồn here) và sử dụng nhiều biến thể khác nhau để có được kết quả mong muốn như:

    Rotate3dAnimation skew = new Rotate3dAnimation(
          30, 0, centerX, centerY, 0, false); 
        txtAmount.startAnimation(skew); 
    

Thật không may, tôi không hoàn toàn nhận được kết quả chính xác phản ánh hình ảnh đầu tiên ở trên. Tôi đang bối rối với các giá trị cài đặt bằng trục Z, nghiêng, xoay, v.v.

Tôi rất cảm kích sự giúp đỡ của bất kỳ ai có kinh nghiệm về nội dung này. Cảm ơn trước

Trả lời

7

Vâng, tôi thậm chí đã cố gắng và tôi đã đưa ra một cái gì đó như thế này:

public class DemoActivity extends TextView { 
    Context context; 
    String firstText = "$120.00"; 

public DemoActivity(Context context) 
    { 
    super(context); 
    this.context = context; 

    } 


    @Override 
    protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    setText(firstText); 
    setTextSize(30); 
    canvas.skew(1.0f, 0.3f); //you need to change values over here 
    Rotate3dAnimation skew = new Rotate3dAnimation(
       -20, 30,200, 200, 0, false); //here too 
    startAnimation(skew); 

     } 
    } 

Tôi có một đầu ra như:

enter image description here

Tôi đoán thay đổi các giá trị bằng cách thử và lỗi có thể giải quyết vấn đề của bạn. Hy vọng điều đó sẽ hữu ích.

+0

Hi Parth, cảm ơn vì câu trả lời của bạn. Bằng cách kết hợp hai cách tiếp cận và giống như bạn đã nói, thay đổi giá trị một chút, tôi hài lòng với kết quả cuối cùng. Tôi đoán tôi sẽ có được ở đó cuối cùng nhưng câu trả lời của bạn sped nó lên :) – elgoog

+2

Tại sao một hoạt động mở rộng một TextView? Chắc chắn đó chỉ là khó hiểu .. –

+1

nó chỉ là một sự lựa chọn xấu của tên @ JamesGoodwin nhưng nó hoạt động tuyệt vời! – Mars

0

Nhờ câu trả lời của Parth Doshi. Câu trả lời của anh cần một chút tinh chỉnh để chạy mà tôi đang chia sẻ ở đây để tiết kiệm thời gian của người khác.

Đầu tiên tạo một lớp trong thư mục src và viết tất cả ba hàm tạo.

public class TextViewDemo extends TextView { 

Context context; 
String text = "TESTING 3DX TOOLS"; 

public TextViewDemo(Context context) { 
    super(context); 
    this.context = context; 
} 

public TextViewDemo(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.context = context; 
} 

public TextViewDemo(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this.context = context; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.onDraw(canvas); 
    setText(text); 
    setTextSize(30); 
    canvas.skew(0.5f, 1.0f); // you need to change values over here 
    Rotate3dAnimation skew = new Rotate3dAnimation(-50, 30, 0, 0, 0, 
      false); // here too 
    startAnimation(skew); 

} 

}

Trong bạn res/layout/my_layout.xml nộp bạn có thể thêm một thẻ tùy chỉnh của bạn làm TextView.

<com.yourpackage.name.TextViewDemo 
    android:id="@+id/name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:text="Hello World" 
<!-- All parameters and value shall remain same --> 
/> 

Giống như bất kỳ quan điểm khác, bạn có thể tạo một thể hiện của TextViewDemo trong phương pháp onCreate() của bạn

TextViewDemo txtDemo = (TextViewDemo) findViewById(R.id.name); 

Trân

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