/* * Copyright 2014 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.example.android.clippingbasic; import com.example.android.common.logger.Log; import android.graphics.Outline; import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.widget.Button; import android.widget.TextView; /** * This sample shows how to clip a {@link View} using an {@link Outline}. */ public class ClippingBasicFragment extends Fragment { private final static String TAG = "ClippingBasicFragment"; /* Store the click count so that we can show a different text on every click. */ private int mClickCount = 0; /* The {@Link Outline} used to clip the image with. */ private ViewOutlineProvider mOutlineProvider; /* An array of texts. */ private String[] mSampleTexts; /* A reference to a {@Link TextView} that shows different text strings when clicked. */ private TextView mTextView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); mOutlineProvider = new ClipOutlineProvider(); mSampleTexts = getResources().getStringArray(R.array.sample_texts); } @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.clipping_basic_fragment, container, false); } @Override public void onViewCreated(final View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); /* Set the initial text for the TextView. */ mTextView = (TextView) view.findViewById(R.id.text_view); changeText(); final View clippedView = view.findViewById(R.id.frame); /* Sets the OutlineProvider for the View. */ clippedView.setOutlineProvider(mOutlineProvider); /* When the button is clicked, the text is clipped or un-clipped. */ view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View bt) { // Toggle whether the View is clipped to the outline if (clippedView.getClipToOutline()) { /* The Outline is set for the View, but disable clipping. */ clippedView.setClipToOutline(false); Log.d(TAG, String.format("Clipping to outline is disabled")); ((Button) bt).setText(R.string.clip_button); } else { /* Enables clipping on the View. */ clippedView.setClipToOutline(true); Log.d(TAG, String.format("Clipping to outline is enabled")); ((Button) bt).setText(R.string.unclip_button); } } }); /* When the text is clicked, a new string is shown. */ view.findViewById(R.id.text_view).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mClickCount++; // Update the text in the TextView changeText(); // Invalidate the outline just in case the TextView changed size clippedView.invalidateOutline(); } }); } private void changeText() { // Compute the position of the string in the array using the number of strings // and the number of clicks. String newText = mSampleTexts[mClickCount % mSampleTexts.length]; /* Once the text is selected, change the TextView */ mTextView.setText(newText); Log.d(TAG, String.format("Text was changed.")); } /** * A {@link ViewOutlineProvider} which clips the view with a rounded rectangle which is inset * by 10% */ private class ClipOutlineProvider extends ViewOutlineProvider { @Override public void getOutline(View view, Outline outline) { final int margin = Math.min(view.getWidth(), view.getHeight()) / 10; outline.setRoundRect(margin, margin, view.getWidth() - margin, view.getHeight() - margin, margin / 2); } } }