アンドロイド関連知識及びスクリーン(B)

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/gaolh89/article/details/81161584

Androidとスクリーン関連の知識ポイント(a)で、私たちのスクリーン、基本的な使用方法、学習単位、スクリーンショット、およびその他の知識ポイントの間の変換に関連する一般的な概念のいくつかは、この記事では、学ぶための画面についての知識を促進します。

この記事を学ぶ前に、それは読むことをお勧めしますアンドロイド関連の知識ポイントの画面を(A)


注:
(1)ローカル本明細書では、試験機に関し、特に断りのない限り、Aはテスター解像度を指す:1080を2160の携帯電話を、テストユニットBは、解像度を指す:720 1280

電話会社の著者は、異なる解像度を必要とするので(2)のTextViewフォントサイズ、同じ幅と高さ制御は、別の電話DP、SP。したがって、コード・セットでは、デフォルトのカスタムプロパティ値のプロセスを使用して異なる解像度ではありません彼らは固定値である。我々はセクションを変更することに注意してくださいを適応要件を投影した場合。

データコードと.XML関係

我々は、XMLのTextViewでネイティブを書くには、次のようにフォントサイズ40spコードが設定されています。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
    >

    <!--直接xml设置-->
    <TextView
        android:id="@+id/tv_xml"
        android:layout_width="300dp"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:background="@color/colorPrimary"
        android:text="测试内容"
        android:textSize="40sp"
        />
</LinearLayout>

コード内のフォントサイズを取得し、その後、次のようにコードは次のとおりです。

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dptext);
        mTvXml = (TextView) findViewById(R.id.tv_xml);
        float textSize = mTvXml.getTextSize();
    }

ブレークポイント試験、試験機A、mTvXmlTextSize値110.0;試験機B、80.0のmTvXmlTextSize値。

また、物事を追加する必要が説明しました:

(1)XMLは、電話システムを変更し、40spを使用しないフォントを設定し、試験機上の結果は、もはや110.0,80.0である。しかし、フォントを設定するために、システムが変更されています。

(2)は、XML 40sp場合40dpに、同じマシン上でテスト結果が110.0,80.0として(電話システムとフォントサイズの変更を設定110.0,80.0あります)

スクリーン関連知識#を使用してXML、コード、カスタムプロパティに関して#2。

私たちの以前に基づき、そして2のTextViewコントロールを追加します。IDのtv_codeをTextViewにTextViewに(ライン23)へのネイティブで。私たちは、コード内のフォントサイズを設定し、tv_customのTextView(ライン33)である.IDマージンがあります継承ネイティブのTextViewカスタムコントロール。

次のようにXMLコードは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
    >

    <!--直接xml设置-->
    <TextView
        android:id="@+id/tv_xml"
        android:layout_width="350dp"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:background="@color/colorPrimary"
        android:text="测试内容"
        android:textSize="40sp"
        />

    <!--通过代码 set的形式-->
    <TextView
        android:id="@+id/tv_code"
        android:layout_width="350dp"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"
        android:background="@color/colorAccent"
        android:text="测试内容"
        />

    <!--通过自定义控件属性的形式-->
    <com.mfc.countdowntimerutils.TestTextView
        android:id="@+id/tv_custom"
        android:layout_width="350dp"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"
        android:background="@color/colorPrimary"
        android:text="测试内容"
        app:testTextMarginTop="20dp"
        app:testTextSize="40sp"
        />

</LinearLayout>

精度をテストするには、TextViewに我々は唯一のフォントサイズを変更、TextViewの距離layout_marginTop。
どの、com.mfc.countdowntimerutils.TestTextViewは制御のTextViewレガシーシステムに属している。カスタムコントロールが不慣れまたはカスタムコントロールのために、話をし、この資料の範囲に属していません興味のある学生は、Googleへの無料。

com.mfc.countdowntimerutils.TestTextViewプロパティコード(以下valuse / arrts)を次のように

  <!--自定义字体大小 margintop的TextView-->
    <declare-styleable name="TestTextView">
        <attr name="testTextSize" format="dimension"/>
        <attr name="testTextMarginTop" format="dimension"/>
    </declare-styleable>

TestTextViewのカスタムコードは次のとおりです。

@SuppressLint("AppCompatCustomView")
public class TestTextView extends TextView implements ViewTreeObserver.OnGlobalLayoutListener {

    private Context    mContext;
    int marginTop;

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

    public TestTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        init(context, attrs);
    }

    public TestTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private void init(Context context, AttributeSet attrs) {

        mContext = context;

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable
                .TestTextView);

        if (typedArray != null) {

           //①如果xml中使用了TestTextView_testTextSize属性,typedArray.getDimensionPixelOffset
            //会根据xml中使用的单位进行内部转化(比如xml中都是使用40sp,不同分辨率手机得到的initTextSize值不同).
            
            //②如果xml中没有使用TestTextView_testTextSize属性,typedArray.getDimensionPixelOffset会直接
            //使用默认的值(它不知道单位的,默认值也没有单位)
            int initTextSize = typedArray.getDimensionPixelOffset(R.styleable
                    .TestTextView_testTextSize, DisplayUtils.sp2px(mContext, 40));
            setTextSize(TypedValue.COMPLEX_UNIT_PX,initTextSize);

            //TestTextView_testTextMarginTop的道理同上述的TestTextView_testTextSize
            marginTop = typedArray.getDimensionPixelOffset(R.styleable
                    .TestTextView_testTextMarginTop, DisplayUtils.dip2px(mContext,20));
            typedArray.recycle();


          post(() -> {

                LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams();
                Log.e("测试元素", "init: " + this);
                lp.leftMargin = 0;
                lp.rightMargin = 0;
                //数据是px
                lp.topMargin = marginTop;
                lp.bottomMargin = 0;
                setLayoutParams(lp);

            });

        }
    }




    @Override
    public void onGlobalLayout() {

        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams();
        Log.e("测试元素", "init: " + this);
        lp.leftMargin = 0;
        lp.rightMargin = 0;
        //数据是px
        lp.topMargin = marginTop;
        lp.bottomMargin = 0;
        setLayoutParams(lp);
    }

//    @Override
//    protected void onFinishInflate() {
//        super.onFinishInflate();
//        getViewTreeObserver().addOnGlobalLayoutListener(this);
//    }

}

上記のコードでは、この論文の範囲議論の一部ではないリライタブルonFinishInflate()メソッド、またはポスト()メソッドは、それが直接使用される場合、それはNULLポインタを報告し、上に描かれたビューを使用することは、省略されています。

さらに2点を留意すべきである:
1.チェックsetTextSize()メソッドのソースは、我々は、この方法は、すなわちつのパラメータを受信したことを見出しsetTextSize(float size)
、以下のようなソースコードの関連部分を:

/**
     * Set the default text size to the given value, interpreted as "scaled
     * pixel" units.  This size is adjusted based on the current density and
     * user font size preference.
     *
     * <p>Note: if this TextView has the auto-size feature enabled than this function is no-op.
     *
     * @param size The scaled pixel size.
     *
     * @attr ref android.R.styleable#TextView_textSize
     */
    @android.view.RemotableViewMethod
    public void setTextSize(float size) {
        setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
    }

唯一つのパラメータが渡された場合、システムは自動的に二つのパラメータにTypedValue.COMPLEX_UNIT_SPを追加し、ソース配線14から見られています。

最初のパラメータはそれでやっている、私たちは次のように、この方法のポイントはソースのソースコードを続けて表示され続けます。

/**
     * Set the default text size to a given unit and value. See {@link
     * TypedValue} for the possible dimension units.
     *
     * <p>Note: if this TextView has the auto-size feature enabled than this function is no-op.
     *
     * @param unit The desired dimension unit.
     * @param size The desired size in the given units.
     *
     * @attr ref android.R.styleable#TextView_textSize
     */
    public void setTextSize(int unit, float size) {
        if (!isAutoSizeEnabled()) {
            setTextSizeInternal(unit, size, true /* shouldRequestLayout */);
        }
    }

ライン7からユニットパラメータの説明を示す:ユニットは、一定のTextView TypedValue.COMPLEX_UNIT_SPの説明をルックアップするために必要な単位の大きさであり、この定数を指すspは、我々は(14)setTextSize手段14spである....間違えやすいピクセル。

同様に、我々は...もちろん、最初のパラメータSP又はDP、置換または実施例の効果を達成するために必要に40sp PX場合、対応する後者の値は、次のコードを設定することができます。

mTvCode.setTextSize(TypedValue.COMPLEX_UNIT_PX,DisplayUtils.sp2px(this,40));

セットマージンやパディング法、またはそれ以上の計算単位はピクセルである広視野に関して2.。あなたはTestTextView_testTextMarginTopは、XMLシステムコールtypedArray.getDimensionPixelOffset(R.styleable.TestTextView_testTextMarginTop、値)属性値を使用している場合は、画面上の解像度は、カスタムXML属性値が自動的に変換/

3.最も原始のTextViewを使用している場合、我々はXMLで、設定されています

android:textSize="40sp"
android:layout_marginTop="20dp"

同じ効果を達成するために、我々はsetTextSize setMarginの方法を使用するには、それを達成する方法である:
(1)TextViewのネイティブな方法を見てみますが、コードの設定を使用して:

public class TestActivity extends AppCompatActivity {

    private TextView mTvXml, mTvCode, mTvCutom;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        mTvXml = (TextView) findViewById(R.id.tv_xml);
        mTvCode = (TextView) findViewById(R.id.tv_code);
        mTvCutom = (TextView) findViewById(R.id.tv_custom);

        //这里的40等同于40sp
        mTvCode.setTextSize(40);


        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mTvCode.getLayoutParams();
        lp.leftMargin = 0;
        lp.rightMargin = 0;
        //数据是px
        int temptopMargin = DisplayUtils.dip2px(this, 20);
        lp.topMargin = temptopMargin;
        lp.bottomMargin = 0;
        mTvCode.setLayoutParams(lp);
        
    }
}

ちょうどあなたが引数である場合は、ユニットの値はSPですので、直接setTextSize(40)を書き、setTextSizeを()と述べていることができます。
あなたのように書かれた2つのパラメータを、使用したい場合:

mTvCode.setTextSize(TypedValue.COMPLEX_UNIT_PX,DisplayUtils.sp2px(this,40));

そしてsetMarginの方法、単位はピクセルが割り当てられ、私たちは、すなわち割り当て、後20dpのPX dpのターンを開始する必要があるため。

 int temptopMargin = DisplayUtils.dip2px(this, 20);
 lp.topMargin = temptopMargin;

これは、携帯電話のブレークポイントのテストデータである(解像度:* 2160 1080)。
ここで説明する絵を書きます

これは、携帯電話Bのブレークテストデータである(解像度:1280 * 720)。
ここで説明する絵を書きます

(2)情報(コードスニペット上記TestTextView.class)カスタムコントロール:

①フォントサイズを設定

      int initTextSize = typedArray.getDimensionPixelOffset(R.styleable.TestTextView_testTextSize, DisplayUtils.sp2px(mContext, 40));
      
      setTextSize(TypedValue.COMPLEX_UNIT_PX,initTextSize);

②設定間隔


marginTop = typedArray.getDimensionPixelOffset(R.styleable.TestTextView_testTextMarginTop, DisplayUtils.dip2px(mContext,20));
          
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams();
Log.e("测试元素", "init: " + this);
lp.leftMargin = 0;
lp.rightMargin = 0;
//数据是px
lp.topMargin = marginTop;
lp.bottomMargin = 0;
setLayoutParams(lp);

、typedArray.getDimensionPixelOffsetは、値がPXである。SetMargin単位値PXが必要とされるため、直接使用なし(変換できない)ことができ、同じ取得しました

これは、ブレークポイントのテストデータの携帯電話です
ここで説明する絵を書きます

これは、携帯電話のBブレークテストデータであります
ここで説明する絵を書きます

特に720 ハンドセットBは明確なデータとなる1280(720 1280モバイル解像度:1DP = 2ピクセル)

機能を実行した後、

次のように電話Aへの影響があります

ここで説明する絵を書きます

次のように電話Bへの影響があります
ここで説明する絵を書きます

それは3つの結果、同一の上にフォントサイズ、間隔、およびコントロール。ためには、この方法の実現可能性を検証することであるかどうかを見出すことができます。

おすすめ

転載: blog.csdn.net/gaolh89/article/details/81161584