2

意図したとおりに機能しなかったため、古いコードを削除しました。画面の特定の部分で onDraw キャンバス機能を使用して、描画の周りにボタンやその他のテキストを配置できるようにしようとしていました。

***編集* **

私は今、この問題を解決することができました。提案されたものの多くは役に立ちましたが、私が望んでいたもので動作させることができませんでした. それはおそらく何よりも私のせいなので、アドバイスを提供してくれたすべての人に感謝します。これが私が問題を解決した方法です。

*1. まず、レイアウト ファイルでビューを定義します。

<view
class="com.project.MainActivity.Drawing"
android:id="@+id/drawing_area"
android:layout_width="700dp"
android:layout_height="900dp"
android:layout_centerInParent="true"/>

*2. 次に、次のコードを使用して別の Java クラス ファイルを作成します。

public class Drawing extends View {
Paint paint = new Paint();

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

public Drawing(Context context, AttributeSet attrs) {
super(context, attrs);
}   

@Override
protected void onDraw(Canvas canvas) {  
super.onDraw(canvas);

//Draw Image Here//

}

*3. 次に、メイン アクティビティから Drawing を呼び出します。

public class MainActivity extends Activity {

private Drawing mDrawingArea;

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.percentage_count_layout);
  mDrawingArea = (Drawing)findViewById(R.id.drawing_area);  
}
4

6 に答える 6

2

View クラスでは、onMeasure() メソッドをオーバーライドする必要があります。ここで、特定のビュー サイズを要求します。このテーマに関する公式の Android チュートリアルがいくつかあります。リンクを使用してコンピューターにアクセスしたら、この投稿を編集します。

編集:

カスタム コンポーネントの作成に関する Android の記事をご覧ください。. 具体的には、'Extend onDraw() and onMeasure()' というタイトルのセクションを見てください。引用:

onMeasure()はもう少し複雑です。onMeasure()コンポーネントとそのコンテナ間のレンダリング コントラクトの重要な部分です。onMeasure()含まれているパーツの測定値を効率的かつ正確に報告するには、オーバーライドする必要があります。これは、親からの制限の要件 (メソッドに渡される) と、測定された幅と高さが計算されたらメソッドonMeasure()を呼び出す必要があるため、少し複雑になります。setMeasuredDimension()オーバーライドされたメソッドからこのメソッドを呼び出さないとonMeasure()、結果は測定時に例外になります。

記事の続き:

コンポーネントのonMeasure()メソッドは、コンポーネントのレンダリングに必要な測定幅と高さを計算する必要があります。で渡された仕様の範囲内にとどまるように努める必要がありますが、それを超えることを選択できます (この場合、親は、クリッピング、スクロール、例外のスロー、または にonMeasure()再試行を要求するなど、何をすべきかを選択できます。測定仕様)。

デモとして利用できる CustomView の例がありますが、残念ながら開発者の Web サイトが変更されており (さらに悪いことに!)、SDK Manager によるダウンロード以外では利用できません。詳細については、こちらのページを参照してください。

于 2013-01-23T17:31:43.487 に答える
1

説明から、問題はDemoViewのサイズを指定していないことであるように思われます。これは、デフォルトで親を埋めるContentViewとして設定しているだけです。

DemoViewを作成するときにいくつかのLayoutParamを指定するか、ViewGroupを作成してサイズを指定します。

XMLを介してレイアウト/サイズを定義し、それを膨らませることもできます。(この場合は、別のクラスにするか、公開する必要があります。)例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    Specify container measurements
    ...
    >
    <com.yourpackagename.MainActivity.DemoView
    ...
    Specify layout height / width, etc.
    ...
    />
</LinearLayout>
于 2013-01-23T17:41:48.667 に答える
0

setContentView()を使用しています。これは、それ自体がビュー全体が全画面表示であることを意味します。画像を特定のサイズだけに設定したい場合は、そのように描画する必要があります。

onDraw(Canvas canvas)
{
     super.onDraw(canvas)
     //This code is for straight centering
     //Also please do math outside of onDraw
     //also below math is pseudocode not actual android code
     canvas.drawBitmap(yourImageBitmap, 
         (screenSize.width / 2) - yourImageBitmap.width/2, 
         (screenSize.height / 2) - yourImageBitmap.height / 2),
         yourPaintObject)

    //The above code should draw your bitmap image in the center of the canvas

}

また、私が言う上下の答えのように、キャンバスのサイズを変更したい場合は、onMeasureを使用してそれらを適切に設定する必要があります。最善の策は、ImageViewクラスのソースコードhttp://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/を確認することです。 ImageView.java と彼らがそれをどのように行うかを見てください

于 2013-01-23T17:33:20.177 に答える
0

これは、画面のデバイス情報を取得するためにビューでオーバーライドできるメソッドであり、デバイスごとに1回実行されます

 @Override
public void onSizeChanged (int w, int h, int oldw, int oldh)
{
    super.onSizeChanged(w, h, oldw, oldh);
    screenW = w;
    screenH = h;

    scaledCardW = (int) (screenW/8); //or whatever scale you need for bitmaps
    scaledCardH = (int) (scaledCardW*1.28);
    bitmap = // load your bitmaps

}
于 2013-01-24T00:51:09.487 に答える
0

Android では、何をしようとしているかのようなレイアウトは、通常 xml で指定されます。レイアウトを xml で設定し (プロジェクトの res/ ディレクトリにレイアウト ディレクトリが必要です)、コードをそのレイアウトに接続します。

このページを見てください。下にスクロールすると、レイアウトの位置、サイズ、パディングに関するセクションがあります。

于 2013-01-23T17:37:39.730 に答える