Актуализиране на границите на изгледа след трансформации на платно (завъртане, мащабиране, трансформиране)

Опитвам се да разбера как да актуализирам границата на моя изглед, за да съответства на платното, след като приложих промени за завъртане, мащабиране и трансформиране.

Това е моят клас за персонализиран текстов изглед. Имам завъртане, работещо както искам, но изгледът не се увива около моето платно.

public class RDTextView extends TextView {

public int angle = 0;

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

@Override
protected void onDraw(Canvas canvas)
{ // Save the current matrix
    canvas.save();
    // Rotate this View at its center
    canvas.rotate(angle,this.getWidth()/2, this.getHeight()/2);
    // Draw it --- will add scale
    super.onDraw(canvas);
    // Restore to the previous matrix
    canvas.restore();
}

Проблемът ми е, че имам рамка около изгледа, но след като променя ъгъла, тя не следва формата на платното.

Преди завъртанеСлед завъртане

Контурът е непроменен след завъртане, но бих искал да го актуализирам, за да съответства на съдържанието.


person Bryan Williams    schedule 04.09.2013    source източник


Отговори (1)


Току-що направих следния код за моите нужди.

    import java.awt.Graphics;
    import java.awt.Graphics2D;

    import javax.swing.JLabel;


    public class RotatedLabel extends JLabel {

        //we need to remember original size
        private int originalWidth = 0;
        private int originalHeight = 0;

        //I do rotation around the center of label, so save it too
        private int originX = 0;
        private int originY = 0;

        public RotatedLabel(String text, int horizotalAlignment) {
            super(text, horizotalAlignment);
        }

        @Override
        public void setBounds(int x, int y, int width, int height) {
            //save new data
            originX = x + width / 2;
            originY = y + height / 2;
            originalWidth = width;
            originalHeight = height;
            super.setBounds(x, y, width, height);
        };

        @Override
        public void paint(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;

            int w2 = getWidth() / 2;
            int h2 = getHeight() / 2;

            double angle = -Math.PI / 2;//it's our angle

            //now we need to recalculate bounds
            int newWidth = (int)Math.abs(originalWidth * Math.cos(angle) + originalHeight * Math.sin(angle));
            int newHeight = (int)Math.abs(originalWidth * Math.sin(angle) + originalHeight * Math.cos(angle));

            g2d.rotate(angle, w2, h2);
            super.paint(g);

            //set new bounds
            super.setBounds(originX - newWidth / 2, originY - newHeight / 2, newWidth, newHeight);
        }
    }
person Vladimir Vlasov    schedule 03.10.2013