2012-04-24 4 views
4

Я довольно много нового в программировании для Android. Мое приложение - пример приложения из api demos на веб-сайте разработчика. Когда я изменяю параметры в этом образце, он становится больше. Этот чертеж должен отображаться в виде прокрутки (его не нужно сжимать, чтобы он соответствовал экрану). Это код, который я использовал:Android: рисование на холсте в Scrollview

DrawPoints.java

public class DrawPoints extends myActivity { 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.routes); 

    } 

    public static class SampleView extends View { 
     private Paint mPaint = new Paint(); 
     private float[] mPts; 

     /*here comes declaration of parametars 



     private void buildPoints() { 

     /*here comes some coding*/ 

      } 
     } 

     public SampleView(Context context, AttributeSet attributeset) { 
      super(context, attributeSet); 

      buildPoints(); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      Paint paint = mPaint; 

      //here also comes code 
     } 
    } 
} 

здесь XML код:

routes.xml

<?xml version="1.0" encoding="utf-8"?> 
    <ScrollView 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/scrollView1" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" > 
     <HorizontalScrollView 
       android:id="@+id/scrollView2" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 

        <!-- This code is just to make sure that scroll views work how 
         I want them to work, image size is 625*351 px 
        <ImageView 
         android:id="@+id/image_View1" 
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent" 
         android:src="@drawable/bus_design" 
          /> --> 
        <my.package.DrawPoints.SampleView 
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent" /> 


     </HorizontalScrollView> 
    </ScrollView> 

Когда я запускаю это приложение и нажмите кнопку в случае сбоя приложения основной активности. Drawing выглядит Figure1, когда я не использую макет XML или scrollviews:

http://i.stack.imgur.com/za5MP.png Figure1

Я также попытался использовать этот код после метода setContentView:

View v = new SampleView(this); 
addContentView(v, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 
      ViewGroup.LayoutParams.FILL_PARENT)); 

, а также это один:

View v = new SampleView(this); 
    ScrollView.LayoutParams lp = new ScrollView.LayoutParams(1000, 1000); 

    addContentView(v, lp); 

Когда я пользуюсь co des, показанный выше, приложение отображает Figure1 без scrollview, похоже, что второй контентный вид перезаписывает этот xml, но он не отображается правильно. После этого я попытался использовать этот код после setContentView:

View v = new SampleView(this); 
    FrameLayout fl = new FrameLayout(this); 
    fl.findViewById(R.id.FrameLayout1); 
    fl.addView(v); 

рамки макета (FrameLayout1) добавляется в routes.xml файл после горизонтальной прокрутки зрения. Когда приложение запускается, я получаю пустой экран без рисунка 1. Есть ли у кого-нибудь идеи, как обновить мой код, который отобразит Рисунок 1 в ScrollView?

Заранее благодарен!

+0

Привет всем, никто не отвечал никакого ответа на мой вопрос, так что я искал какие-то решения. Я обнаружил, что в android не реализована двунаправленная прокрутка Я нашел действительно хорошую реализацию двунаправленной прокрутки на этой веб-странице [ссылка] http://stackoverflow.com/questions/2044775/scrollview-vertical-and-horizontal-in- android решение было опубликовано Mahdi Hijazi. Решение работает как шарм, но когда я пытаюсь реализовать свой класс SampleView на его решении, ничего не происходит. Если у меня получится какое-то решение, я опубликую это решение. До тех пор надеемся, что у кого-то есть решение. – Kristijan

ответ

4

Наконец-то я нашел решение своей проблемы. Я использовал решение с этого сайта:

Link1

я хорошо видел, что решение раньше, но, к сожалению, я не понял, что это решение хорошо для меня. Я знал, что мне нужен метод onMeasure для Canvas, чтобы показать его в xml, но с решением от упомянутого сайта это не сработало. Теперь это работает. Вот мой xml и SampleView.

код XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/app_layout" android:orientation="horizontal" 
    android:layout_width="fill_parent" android:layout_height="fill_parent"> 
    <!-- SCENE --> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/scene_layout" 
     android:drawingCacheQuality="low" 
     android:orientation="horizontal" android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     <com.testiranje.Kristijan.TwoDScrollView 
      android:id="@+id/scene_scroller" android:drawingCacheQuality="low" 
      android:scrollbars="horizontal" 

      android:layout_width="fill_parent" android:layout_height="fill_parent"> 
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/scene_container" 
       android:drawingCacheQuality="low" 
       android:background="@drawable/map" 
       android:layout_width="fill_parent" android:layout_height="fill_parent"> 

       <com.testiranje.Kristijan.SampleView 
        android:layout_height="fill_parent" 
        android:layout_width="fill_parent"> 

        </com.testiranje.Kristijan.SampleView> 

       <!-- <ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/scene_background" android:drawingCacheQuality="low" 
        android:background="@drawable/map" 
        android:layout_width="fill_parent" android:layout_height="fill_parent" /> --> 
      </RelativeLayout> 
     </com.testiranje.Kristijan.TwoDScrollView> 
    </RelativeLayout> 
</RelativeLayout> 

Это мое SampleView решение:

public class SampleView extends View { 
    private Paint mPaint = new Paint(); 
    private float[] mPts; 

    private static final float SIZE = 1000; 
    private static final int SEGS = 50; 
    private static final int X = 0; 
    private static final int Y = 1; 

    private void buildPoints() { 
     final int ptCount = (SEGS + 1) * 2; 
     mPts = new float[ptCount * 2]; 

     float value = 0; 
     final float delta = SIZE/SEGS; 
     for (int i = 0; i <= SEGS; i++) { 
      mPts[i*4 + X] = SIZE - value; 
      mPts[i*4 + Y] = 0; 
      mPts[i*4 + X + 2] = 0; 
      mPts[i*4 + Y + 2] = value; 
      value += delta; 
     } 
    } 

    public SampleView(Context context){ 
     super(context); 
     //initSampleView(); 
     buildPoints(); 

    } 

    //This constructor is very important because withouth of this 
    //you can't insert this view in xml 
    public SampleView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     //initSampleView(); 
     buildPoints(); 
    } 

    /*private final void initSampleView() { 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     setPadding(3, 3, 3, 3); 
    }*/ 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     setMeasuredDimension(measureWidth(widthMeasureSpec), 
       measureHeight(heightMeasureSpec)); 
    } 

    /** 
    * Determines the width of this view 
    * @param measureSpec A measureSpec packed into an int 
    * @return The width of the view, honoring constraints from measureSpec 
    */ 
    private int measureWidth(int measureSpec) { 
     int result = 0; 
     //This is because of background image in relativeLayout, which is 1000*1000px 
     measureSpec = 1001; 
     int specMode = MeasureSpec.getMode(measureSpec); 
     int specSize = MeasureSpec.getSize(measureSpec); 

     if (specMode == MeasureSpec.UNSPECIFIED) { 
      // We were told how big to be 
      result = specSize; 
     } 

     return result; 
    } 

    /** 
    * Determines the height of this view 
    * @param measureSpec A measureSpec packed into an int 
    * @return The height of the view, honoring constraints from measureSpec 
    */ 
    private int measureHeight(int measureSpec) { 
     int result = 0; 
     //This is because of background image in relativeLayout, which is 1000*1000px 
     measureSpec = 1001; 
     int specMode = MeasureSpec.getMode(measureSpec); 
     int specSize = MeasureSpec.getSize(measureSpec); 


     if (specMode == MeasureSpec.UNSPECIFIED) { 
      // Here we say how Heigh to be 
      result = specSize; 
     } 
     return result; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     Paint paint = mPaint; 

     canvas.translate(10, 10); 

     paint.setColor(Color.RED); 
     paint.setStrokeWidth(0); 
     canvas.drawLines(mPts, paint); 


     paint.setColor(Color.BLUE); 
     paint.setStrokeWidth(3); 
     canvas.drawPoints(mPts, paint); 

    } 
} 

Теперь я получил это изображение, когда я бегу мое приложение:

http://i.stack.imgur.com/lWhvT.png

Если у кого есть вопросы об этом, не стесняйтесь спрашивать меня :).

+0

Как добавить прокрутку на холст? – AnAndroid

10

написать эту строку в вашем TouchEvent заказного Посмотреть класс

GetParent(). RequestDisallowInterceptTouchEvent (правда)

+1

Это так awsome :) лучшее решение, далекое спасибо! Я просто назову это на родительском элементе 'ScrollView'. – JWqvist

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