/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.gallery3d.filtershow.state; import android.content.Context; import android.content.res.Resources; import android.graphics.*; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewParent; import android.widget.LinearLayout; import com.android.gallery3d.R; import com.android.gallery3d.filtershow.FilterShowActivity; import com.android.gallery3d.filtershow.imageshow.MasterImage; public class StateView extends View { private static final String LOGTAG = "StateView"; private Path mPath = new Path(); private Paint mPaint = new Paint(); public static int DEFAULT = 0; public static int BEGIN = 1; public static int END = 2; public static int UP = 1; public static int DOWN = 2; public static int LEFT = 3; public static int RIGHT = 4; private int mType = DEFAULT; private float mAlpha = 1.0f; private String mText = "Default"; private float mTextSize = 32; private static int sMargin = 16; private static int sArrowHeight = 16; private static int sArrowWidth = 8; private int mOrientation = LinearLayout.VERTICAL; private int mDirection = DOWN; private boolean mDuplicateButton; private State mState; private int mEndsBackgroundColor; private int mEndsTextColor; private int mBackgroundColor; private int mTextColor; private int mSelectedBackgroundColor; private int mSelectedTextColor; private Rect mTextBounds = new Rect(); public StateView(Context context) { this(context, DEFAULT); } public StateView(Context context, int type) { super(context); mType = type; Resources res = getResources(); mEndsBackgroundColor = res.getColor(R.color.filtershow_stateview_end_background); mEndsTextColor = res.getColor(R.color.filtershow_stateview_end_text); mBackgroundColor = res.getColor(R.color.filtershow_stateview_background); mTextColor = res.getColor(R.color.filtershow_stateview_text); mSelectedBackgroundColor = res.getColor(R.color.filtershow_stateview_selected_background); mSelectedTextColor = res.getColor(R.color.filtershow_stateview_selected_text); mTextSize = res.getDimensionPixelSize(R.dimen.state_panel_text_size); } public String getText() { return mText; } public void setText(String text) { mText = text; invalidate(); } public void setType(int type) { mType = type; invalidate(); } @Override public void setSelected(boolean value) { super.setSelected(value); if (!value) { mDuplicateButton = false; } invalidate(); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { ViewParent parent = getParent(); if (parent instanceof PanelTrack) { ((PanelTrack) getParent()).onTouch(event, this); } if (mType == BEGIN) { MasterImage.getImage().setShowsOriginal(true); } } if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { MasterImage.getImage().setShowsOriginal(false); } return true; } public void drawText(Canvas canvas) { if (mText == null) { return; } mPaint.reset(); if (isSelected()) { mPaint.setColor(mSelectedTextColor); } else { mPaint.setColor(mTextColor); } if (mType == BEGIN) { mPaint.setColor(mEndsTextColor); } mPaint.setTypeface(Typeface.DEFAULT_BOLD); mPaint.setAntiAlias(true); mPaint.setTextSize(mTextSize); mPaint.getTextBounds(mText, 0, mText.length(), mTextBounds); int x = (canvas.getWidth() - mTextBounds.width()) / 2; int y = mTextBounds.height() + (canvas.getHeight() - mTextBounds.height()) / 2; canvas.drawText(mText, x, y, mPaint); } public void onDraw(Canvas canvas) { canvas.drawARGB(0, 0, 0, 0); mPaint.reset(); mPath.reset(); float w = canvas.getWidth(); float h = canvas.getHeight(); float r = sArrowHeight; float d = sArrowWidth; if (mOrientation == LinearLayout.HORIZONTAL) { drawHorizontalPath(w, h, r, d); } else { if (mDirection == DOWN) { drawVerticalDownPath(w, h, r, d); } else { drawVerticalPath(w, h, r, d); } } if (mType == DEFAULT || mType == END) { if (mDuplicateButton) { mPaint.setARGB(255, 200, 0, 0); } else if (isSelected()) { mPaint.setColor(mSelectedBackgroundColor); } else { mPaint.setColor(mBackgroundColor); } } else { mPaint.setColor(mEndsBackgroundColor); } canvas.drawPath(mPath, mPaint); drawText(canvas); } private void drawHorizontalPath(float w, float h, float r, float d) { mPath.moveTo(0, 0); if (mType == END) { mPath.lineTo(w, 0); mPath.lineTo(w, h); } else { mPath.lineTo(w - d, 0); mPath.lineTo(w - d, r); mPath.lineTo(w, r + d); mPath.lineTo(w - d, r + d + r); mPath.lineTo(w - d, h); } mPath.lineTo(0, h); if (mType != BEGIN) { mPath.lineTo(0, r + d + r); mPath.lineTo(d, r + d); mPath.lineTo(0, r); } mPath.close(); } private void drawVerticalPath(float w, float h, float r, float d) { if (mType == BEGIN) { mPath.moveTo(0, 0); mPath.lineTo(w, 0); } else { mPath.moveTo(0, d); mPath.lineTo(r, d); mPath.lineTo(r + d, 0); mPath.lineTo(r + d + r, d); mPath.lineTo(w, d); } mPath.lineTo(w, h); if (mType != END) { mPath.lineTo(r + d + r, h); mPath.lineTo(r + d, h - d); mPath.lineTo(r, h); } mPath.lineTo(0, h); mPath.close(); } private void drawVerticalDownPath(float w, float h, float r, float d) { mPath.moveTo(0, 0); if (mType != BEGIN) { mPath.lineTo(r, 0); mPath.lineTo(r + d, d); mPath.lineTo(r + d + r, 0); } mPath.lineTo(w, 0); if (mType != END) { mPath.lineTo(w, h - d); mPath.lineTo(r + d + r, h - d); mPath.lineTo(r + d, h); mPath.lineTo(r, h - d); mPath.lineTo(0, h - d); } else { mPath.lineTo(w, h); mPath.lineTo(0, h); } mPath.close(); } public void setBackgroundAlpha(float alpha) { if (mType == BEGIN) { return; } mAlpha = alpha; setAlpha(alpha); invalidate(); } public float getBackgroundAlpha() { return mAlpha; } public void setOrientation(int orientation) { mOrientation = orientation; } public void setDuplicateButton(boolean b) { mDuplicateButton = b; invalidate(); } public State getState() { return mState; } public void setState(State state) { mState = state; mText = mState.getText().toUpperCase(); mType = mState.getType(); invalidate(); } public void resetPosition() { setTranslationX(0); setTranslationY(0); setBackgroundAlpha(1.0f); } public boolean isDraggable() { return mState.isDraggable(); } }