0

コンポーネントの余白を使ってスライドアニメーションを作成しました。

残念ながら、右側の要素(エディットテキスト)を画面から「プッシュ」すると、エッジ部分を切り取るのではなく、サイズが変更されます。

たとえば、editTextに1000dpを適用することで、希望どおりに動作させることができますが、このeditTextは、ハードコードされた幅ではなく、画面の幅に合わせて調整する必要があります。

スタート画面:

スタート画面

間違った振る舞い:

間違った行動

良い振る舞い :

良い振る舞い

これが私のカスタムルートコンポーネントの「アニメーション」のコードです:

package com.example.components;

import com.example.database.NoteDataSource;
import com.example.memonotepad.R;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.LinearLayout;
import android.app.Activity;

public class SlideRightNLeft extends LinearLayout{

private LinearLayout.LayoutParams params1;

int x;

private SlideRightNLeft srnl;

private Context context_f;

private int slideDistance;


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

public SlideRightNLeft(Context context, AttributeSet attrs) {
    super(context, attrs);
    context_f = context;
    srnl = this;
    slideDistance = (int) context_f.getResources().getDimension(R.dimen.slide_distance);

}

public SlideRightNLeft(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}



public void slideLogin(){


    Thread slideIt = new Thread(new Runnable() {
        @Override
        public void run() {

            x = 0;
            params1 = new LinearLayout.LayoutParams(srnl.getChildAt(0).getWidth(), srnl.getChildAt(0).getHeight());

            while(x < slideDistance) {

                try {
                    Thread.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                ((Activity)context_f).runOnUiThread(new Runnable(){

                    @Override
                    public void run() {

                        int diff = x - slideDistance;

                        params1.setMargins(diff, 1, 1, 1);

                        srnl.getChildAt(0).setLayoutParams(params1);

                        srnl.invalidate();

                    }
                });

                x++;

            }
        }
    });

    slideIt.start();

}




}

アクティビティコード:

package com.example.memonotepad;

import java.util.Calendar;
import java.util.Date;

import com.example.components.SlideRightNLeft;
import com.example.database.NoteDataSource;
import com.example.adapter.NotesAdapter;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.view.Display;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class MemoNotepad extends Activity {

private SlideRightNLeft mainGroupComponent;
private Button slideLogin;
private Button addNote;

private NoteDataSource nds;

private Date rightNowDate;

private ListView lvNote;

private Cursor lvCursor;

private NotesAdapter na;

private EditText edt;

public static int width;

WindowManager mWinMgr;

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

    mWinMgr = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE);
    width = mWinMgr.getDefaultDisplay().getWidth();

    edt = (EditText) findViewById(R.id.textBook);

    edt.setWidth(width);
    edt.setMinimumWidth(width);

    mainGroupComponent = (SlideRightNLeft) findViewById(R.id.mainGroupLayout);
    nds = new NoteDataSource(this);

    lvNote = (ListView) findViewById(R.id.listNotes);

    lvCursor = nds.getAllNotes();

    na = new NotesAdapter(this, lvCursor);
    lvNote.setAdapter(na);

    slideLogin = (Button) findViewById(R.id.login_button);
    slideLogin.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            mainGroupComponent.slideLogin();
        }
    });

    addNote = (Button) findViewById(R.id.new_note);
    addNote.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Calendar rightNow = Calendar.getInstance();
            rightNowDate = rightNow.getTime();  // dt is now the new date
            nds.createNote("Note", "text inside", rightNowDate);
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_memo_notepad, menu);
    return true;
}
}
4

1 に答える 1

1

たとえば、editTextに1000dpを適用することで、希望どおりに動作させることができますが、このeditTextは、ハードコードされた幅ではなく、画面の幅に合わせて調整する必要があります。

デバイスの幅を取得してみませんか?

mWinMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
int displayWidth = mWinMgr.getDefaultDisplay().getWidth();
于 2013-01-19T07:44:27.533 に答える