0
裁剪我必須建立一個自定義視圖的Android線性佈局與動畫
我實現此作爲延伸的LinearLayout自定義視圖的要求,所述的LinearLayout包含兩個以上LinearLayouts(每行),並且每個元件是延伸的RelativeLayout的幷包含用於動畫/狀態變化的功能的另一自定義視圖。
我遇到的問題是..因爲動畫長大的圓圈箭頭縮放的ImageView的ImageView的是由其父容器裁剪,因爲大小設置一次繪製。我可以在父自稱setScaleX/Y縮放ImageView的前..但後來我得到一些怪異的行爲......必須有一個簡單的解決方案!
類佈局文件
public class CameraCalibrationIndicatorCircles extends LinearLayout {
ArrayList<CalibrationIndicatorCircle> circles;
int currentCircleIndex = 0;
public CameraCalibrationIndicatorCircles(Context context) {
super(context);
initialize(context);
}
public CameraCalibrationIndicatorCircles(Context context, AttributeSet attrs) {
super(context, attrs);
initialize(context);
}
public CameraCalibrationIndicatorCircles(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initialize(context);
}
public void initialize(Context context){
inflate(context, R.layout.camera_calibration_indication_circles_view, this);
circles = new ArrayList<>();
CalibrationIndicatorCircle
c0, c1, c2, c3, c4,
c5, c6, c7, c8, c9;
c0 = (CalibrationIndicatorCircle)findViewById(R.id.c0);
c1 = (CalibrationIndicatorCircle)findViewById(R.id.c1);
c2 = (CalibrationIndicatorCircle)findViewById(R.id.c2);
c3 = (CalibrationIndicatorCircle)findViewById(R.id.c3);
c4 = (CalibrationIndicatorCircle)findViewById(R.id.c4);
c5 = (CalibrationIndicatorCircle)findViewById(R.id.c5);
c6 = (CalibrationIndicatorCircle)findViewById(R.id.c6);
c7 = (CalibrationIndicatorCircle)findViewById(R.id.c7);
c8 = (CalibrationIndicatorCircle)findViewById(R.id.c8);
c9 = (CalibrationIndicatorCircle)findViewById(R.id.c9);
circles.add(c0);
circles.add(c1);
circles.add(c2);
circles.add(c3);
circles.add(c4);
circles.add(c5);
circles.add(c6);
circles.add(c7);
circles.add(c8);
circles.add(c9);
currentCircleIndex = 0;
circles.get(currentCircleIndex).indicateCurrent();
}
public void successfulEvent(){
if(currentCircleIndex < CalibrationBox.MINIMUM_NUMBER_OF_CAMERA_IMAGES_FOR_CALIB) {
circles.get(currentCircleIndex).indicateSucess(1,1, true);
currentCircleIndex++;
if (currentCircleIndex < CalibrationBox.MINIMUM_NUMBER_OF_CAMERA_IMAGES_FOR_CALIB)
circles.get(currentCircleIndex).indicateCurrent();
}
}
}
佈局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:weightSum="4"
android:clipChildren="false">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:weightSum="5"
android:layout_weight="1"
android:orientation="horizontal"
android:clipChildren="false">
<CalibrationIndicatorCircle
android:id="@+id/c0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<CalibrationIndicatorCircle
android:id="@+id/c1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<CalibrationIndicatorCircle
android:id="@+id/c2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<CalibrationIndicatorCircle
android:id="@+id/c3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<CalibrationIndicatorCircle
android:id="@+id/c4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:weightSum="5"
android:layout_weight="1"
android:orientation="horizontal">
<CalibrationIndicatorCircle
android:id="@+id/c5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<CalibrationIndicatorCircle
android:id="@+id/c6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<CalibrationIndicatorCircle
android:id="@+id/c7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<CalibrationIndicatorCircle
android:id="@+id/c8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<CalibrationIndicatorCircle
android:id="@+id/c9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
單圈視圖類
public class CalibrationIndicatorCircle extends RelativeLayout {
ImageView mWaiting, mCurrent, mSuccess, mCompleted;
boolean mIsCurrent = false;
Context mContext;
public CalibrationIndicatorCircle(Context context) {
super(context);
initialize(context);
}
public CalibrationIndicatorCircle(Context context, AttributeSet attrs) {
super(context, attrs);
initialize(context);
}
public CalibrationIndicatorCircle(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initialize(context);
}
public void initialize(Context context){
inflate(context, R.layout.calibration_indicator_circle_view, this);
mWaiting = (ImageView)findViewById(R.id.waiting);
mCurrent = (ImageView)findViewById(R.id.current);
mSuccess = (ImageView)findViewById(R.id.success);
mCompleted = (ImageView)findViewById(R.id.completed);
mCurrent.setVisibility(INVISIBLE);
mSuccess.setVisibility(INVISIBLE);
mCompleted.setVisibility(INVISIBLE);
}
public void indicateCurrent(){
post(new Runnable() {
@Override
public void run() {
mWaiting.setVisibility(INVISIBLE);
mCurrent.setVisibility(VISIBLE);
mIsCurrent = true;
}
});
}
public void indicateSucess(final float scaleX, final float scaleY, final boolean hideCheckMark){
post(new Runnable() {
@Override
public void run() {
//Animate
mSuccess.setScaleX(0);
mSuccess.setScaleY(0);
mSuccess.setVisibility(VISIBLE);
mCurrent.setVisibility(INVISIBLE);
mWaiting.setVisibility(INVISIBLE);
mSuccess
.animate()
.scaleX(scaleX)
.scaleY(scaleY)
.setDuration(500)
.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
if(hideCheckMark) {
new Thread(new Runnable() {
@Override
public void run() {
postDelayed(new Runnable() {
@Override
public void run() {
mSuccess.setVisibility(INVISIBLE);
mCompleted.setVisibility(VISIBLE);
}
}, 300);
}
}).start();
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
})
.start();
}
});
}
public void hideUntilReady() {
post(new Runnable() {
@Override
public void run() {
mWaiting.setVisibility(INVISIBLE);
mCurrent.setVisibility(INVISIBLE);
mSuccess.setVisibility(INVISIBLE);
mCompleted.setVisibility(INVISIBLE);
}
});
}
}
單圈佈局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:clipChildren="false">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/image_success_icon"
android:layout_centerInParent="true"
android:id="@+id/success"
android:scaleType="fitXY" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/image_current_icon"
android:layout_centerInParent="true"
android:id="@+id/current"
android:scaleType="fitXY" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/image_waiting_icon"
android:id="@+id/waiting"
android:layout_centerInParent="true"
android:scaleType="fitXY" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/image_taken_icon"
android:id="@+id/completed"
android:layout_centerInParent="true"
android:scaleType="fitXY" />
</RelativeLayout>
嘗試這樣做在像了層次結構的佈局的每一層被..與視圖的大小做被設置一次繪製不管動畫 – Arjun
我一直使用這個很長一段時間,它的工作很棒。如果您使用xml發佈代碼,那麼我們只能進一步挖掘。 –
我已經添加了上面的代碼 – Arjun