コンポーネントの余白を使ってスライドアニメーションを作成しました。
残念ながら、右側の要素(エディットテキスト)を画面から「プッシュ」すると、エッジ部分を切り取るのではなく、サイズが変更されます。
たとえば、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;
}
}