2011-12-16 4 views
4

Я хочу, чтобы иметь возможность отражать мое приложение, чтобы его можно было увидеть в лобовом стекле транспортного средства.Как я могу отразить весь экран?

У моего XML есть несколько вложенных LinearLayout s, TextView s и ImageView s. В настоящее время я преобразую каждый из них, и хотя он зеркалирован, структура элементов не является (то, что было наверху сейчас внизу).

Я искал дни и до сих пор пробовал пару подходов, которые потерпели неудачу.

Анимация, в которой используется матрица для работы по типам X-оси, за исключением того, что она либо возвращается, либо остается и не обновляется, что не подходит для взаимодействия с приложением.

Я просто попытался создать собственный LinearLayout расширяющие родитель один, надеясь, что я мог бы применить матрицу в методе onDraw(), но это дает мне пустой экран (я должен был установить setWillNotDraw(false); ударить onDraw()).

+0

Прохладный идея. Звучит интересно. – fredley

+0

Хммм, ладно, интересно, где остался мой вопрос! Излишне говорить, что моя последняя попытка тоже не работала, и теперь я в тупике. –

+0

Мне просто интересно: будет ли возможность внести изменения на нижнем уровне, который может отразить весь выход системы на экран? Это, безусловно, потребует привилегий root, но для приложений без такой функции - большой взлом, чтобы отображать их на лобовом стекле. – bcelary

ответ

0

Вы можете использовать новую анимацию api, чтобы справиться с возвратом назад после горизонтального перелиста.

+0

Спасибо, значит ли это, что он останется в своем последнем состоянии и все еще перерисовывается, как если бы он не был анимирован? Я лучше пойду и просмотрю документы для этого нового API. –

+0

Я не 100% на этом, но если моя память служит мне правильной, да, да. – josephus

3

В конце концов я нашел решение, которое хорошо работает для меня (пока это не вызвало проблем для пользователей).

Моим решением было переопределить dispatchDraw, чтобы масштабировать холст в моем обычном LinearLayout. Затем мне просто нужно было перевернуть события касания, переопределив dispatchTouchEvent:

public class CustomContainer extends LinearLayout { 

    public CustomContainer(Context context) { 
     super(context); 
     this.setWillNotDraw(false); 
    } 

    public CustomContainer(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.setWillNotDraw(false); 
    } 

    public CustomContainer(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     this.setWillNotDraw(false); 
    } 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     canvas.save(Canvas.MATRIX_SAVE_FLAG); 
     // Flip the view canvas 
     if (MyHUDActivity.mHUDMode) canvas.scale(1,-1, getWidth(), getHeight()/2f); 
     super.dispatchDraw(canvas); 
     canvas.restore(); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     // If in HUD mode then flip the touch zones 
     if (MyHUDActivity.mHUDMode) event.setLocation(event.getX(), getHeight()-event.getY()); 
     return super.dispatchTouchEvent(event); 
    } 
}