Android provides Animation API. By
using we can create custom animations . Android sample provides
Animation classes for some standard types like 3D rotation, Push up ,
shake etc.
Step 1 : include Rotate3dAnimation.java
file in your package.
Step 2 : create a reportview.xml as
layout file.
Step 3 : below is code to provide 360
degree rotation and display a html file from assets folder.
XML file Layout code
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/webAnim1"></WebView> <WebView android:id="@+id/webAnim" android:layout_height="fill_parent" android:layout_width="fill_parent"></WebView> </FrameLayout>
public class HTMLReportDisplay extends Activity { private ViewGroup mContainer; private WebView mWebView; private WebView mWebView1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.reportview); mContainer = (ViewGroup) findViewById(R.id.container); mWebView = (WebView) findViewById(R.id.webAnim); mWebView1 = (WebView) findViewById(R.id.webAnim1); String report = "name of html file from asset folder"; mWebView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR); mWebView.getSettings().setBuiltInZoomControls(true); mWebView.loadUrl("file:///android_asset/" + report + ".html"); mWebView1.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR); mWebView1.getSettings().setBuiltInZoomControls(true); mWebView1.loadUrl("file:///android_asset/" + report + ".html"); /** Since we are caching large views, we want to keep their cache between each animation*/ mContainer .setPersistentDrawingCache(ViewGroup.PERSISTENT_ANIMATION_CACHE); applyRotation(1, 90, 0); } /** * Setup a new 3D rotation on the container view. * * @param position * the item that was clicked to show a picture, or -1 to show the * list * @param start * the start angle at which the rotation must begin * @param end * the end angle of the rotation */ private void applyRotation(int position, float start, float end) { // Find the center of the container final float centerX = mContainer.getWidth() / 2.0f; final float centerY = mContainer.getHeight() / 2.0f; /** Create a new 3D rotation with the supplied parameter The animation listener is used to trigger the next animation*/ final Rotate3dAnimation rotation = new Rotate3dAnimation(start, end, centerX, centerY, 310.0f, true); rotation.setDuration(400); rotation.setFillAfter(true); rotation.setInterpolator(new AccelerateInterpolator()); rotation.setAnimationListener(new DisplayNextView(position)); mContainer.startAnimation(rotation); } /** * this function is called when any key is pressed. */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { /** Check if back button key is pressed */ case KeyEvent.KEYCODE_BACK: applyRotation(-1, 180, 0); new Handler().postDelayed(new Runnable() { public void run() { finishActivity(); } }, 300); break; } return super.onKeyDown(keyCode, event); } private void finishActivity() { finish(); } /** * This class listens for the end of the first half of the animation. It * then posts a new action that effectively swaps the views when the * container is rotated 90 degrees and thus invisible. */ private final class DisplayNextView implements Animation.AnimationListener { private final int mPosition; public DisplayNextView(int position) { mPosition = position; } public void onAnimationStart(Animation animation) { } public void onAnimationEnd(Animation animation) { mContainer.post(new SwapViews(mPosition)); } public void onAnimationRepeat(Animation animation) { } } /** * This class is responsible for swapping the views and start the second * half of the animation. */ private final class SwapViews implements Runnable { private final int mPosition; public SwapViews(int position) { mPosition = position; } public void run() { final float centerX = mContainer.getWidth() / 2.0f; final float centerY = mContainer.getHeight() / 2.0f; Rotate3dAnimation rotation; if (mPosition > -1) { mWebView.setVisibility(View.GONE); mWebView1.setVisibility(View.VISIBLE); mWebView1.requestFocus(); rotation = new Rotate3dAnimation(180, 0, centerX, centerY, 310.0f, false); } else { mWebView1.setVisibility(View.GONE); mWebView.setVisibility(View.VISIBLE); mWebView.requestFocus(); rotation = new Rotate3dAnimation(90, 0, centerX, centerY, 310.0f, false); } rotation.setDuration(500); rotation.setFillAfter(true); rotation.setInterpolator(new DecelerateInterpolator()); mContainer.startAnimation(rotation); } } }