2016-07-08 3 views
0

Мне нужно начать работу с двумя круговыми растровыми изображениями в центре, которые должны мгновенно анимироваться и слегка перемещаться в сторону, чтобы часть одного растрового изображения была вне экрана и не видна. Позже, когда пользователь покидает активность, он должен анимироваться таким же образом, но назад (перемещаться из стороны в центр).Android: создание видимого растрового изображения при перемещении

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

Это, как растровые изображения нарисованы:

public class MyImageView extends ImageView { 

    private Canvas offscreen; 

    private static Bitmap pattern; 
    private static Bitmap logo; 

    private static int screenWidth, screenHeight; //The real size of the screen 
    private static int patternDiameter, logoDiameter; //bitmaps' dimensions, both images are circles 

    private static float topPatternMargin, leftPatternMargin; 
    private static float topLogoMargin, leftLogoMargin; 

    public MyImageView (Context context, AttributeSet attrs) { 
     super(context, attrs); 

     screenWidth = getSize(context)[0]; 
     screenHeight = getSize(context)[1]; 

     patternDiameter = (int)(screenWidth * (1005.0/1280.0)); 
     logoDiameter = (int)(patternDiameter * (230.0/502.5)); 

     pattern = BitmapFactory.decodeResource(context.getResources(), R.drawable.start_pattern); 
     pattern = Bitmap.createScaledBitmap(pattern, patternDiameter, patternDiameter, false); 
     logo = BitmapFactory.decodeResource(context.getResources(), R.drawable.start_logo); 
     logo = Bitmap.createScaledBitmap(logo, logoDiameter, logoDiameter, false); 

     leftPatternMargin = (float) ((screenWidth) * (430.0/1280.0) - (patternDiameter/2.0)); 
     topPatternMargin = (float) ((screenHeight - patternDiameter)/2.0); 
     leftLogoMargin = (float) (leftPatternMargin + patternDiameter/2.0 - logoDiameter/2.0); 
     topLogoMargin = (float)(topPatternMargin + patternDiameter/2.0 - logoDiameter/2.0); 

     offscreen = new Canvas(pattern); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     if(canvas==offscreen) 
      super.onDraw(offscreen); 

     else { 

      super.draw(offscreen); 

      canvas.drawBitmap(pattern, leftPatternMargin, topPatternMargin, null); 
      canvas.drawBitmap(logo, leftLogoMargin, topLogoMargin, null); 

     } 

    } 
} 

Так что мой вопрос, как бы я изменить этот код (или, может быть, какой-то другой код), так что, когда я делаю экземпляр этого класса двигаться вокруг, все его части видны пользователю?

ответ

0

Я нашел ответ здесь:

When drawing outside the view clip bounds with Android: how do I prevent underling views from drawing on top of my custom view?

Решение добавить эту строку в макете:

android:clipChildren="false" 
+0

да я автор этого ответа. Пожалуйста, если вы делаете это для анимации, НЕ устанавливайте его на макет. Установите его перед началом анимации и удалите его, когда закончите анимацию. (по коду) –

+0

PS: альтернативой этому является использование ViewOverlay и перемещение вашего вида (временного) в оверлей для анимации и обратно в контейнер, когда вы закончите. Это имеет смысл специально для анимации представления, которое меняет родительский контейнер. Если вы используете ViewOverlay из самого верхнего родительского представления, которое позволяет вам показывать анимацию без обрезки. –

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