Android开发实现计算器的例子

 更新时间:2016年9月20日 19:59  点击:1886
学完了Java(虽说没怎么练手),开始学Android编程。首先还是做个计算器(感觉这辈子只能做计算器了 话说Android的布局真是太方便了,下面是布局文件

例子

 代码如下 复制代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/warpcontent"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <HorizontalScrollView
        android:id="@+id/scrollview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/resultText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:gravity="right"
            android:padding="8dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:text="@string/number0"
            android:textSize="40sp" />
    </HorizontalScrollView >

    <TableLayout
        android:id="@+id/buttonTable"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:stretchColumns="*" >

        <TableRow
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1" >

            <Button
                android:id="@+id/button7"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/number7" />

            <Button
                android:id="@+id/button8"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/number8" />

            <Button
                android:id="@+id/button9"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/number9" />

            <Button
                android:id="@+id/buttonBackSpace"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/backspace" />

            <Button
                android:id="@+id/buttonClear"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/clear" />
        </TableRow>

        <TableRow
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1" >

            <Button
                android:id="@+id/button4"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/number4" />

            <Button
                android:id="@+id/button5"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/number5" />

            <Button
                android:id="@+id/button6"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/number6" />

            <Button
                android:id="@+id/buttonMultiply"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/multiply" />

            <Button
                android:id="@+id/buttonDivide"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:onClick="onClickListener"
                android:text="@string/divide" />
        </TableRow>
    </TableLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <TableLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="3"
            android:stretchColumns="*" >

            <TableRow
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1" >

                <Button
                    android:id="@+id/button1"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:onClick="onClickListener"
                    android:text="@string/number1" />

                <Button
                    android:id="@+id/button2"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:onClick="onClickListener"
                    android:text="@string/number2" />

                <Button
                    android:id="@+id/button3"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:onClick="onClickListener"
                    android:text="@string/number3" />
            </TableRow>

            <TableRow
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1" >

                <Button
                    android:id="@+id/button0"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:onClick="onClickListener"
                    android:text="@string/number0" />

                <Button
                    android:id="@+id/buttonDot"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:onClick="onClickListener"
                    android:text="@string/dot" />

                <Button
                    android:id="@+id/buttonNegSign"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:onClick="onClickListener"
                    android:text="@string/negSign" />
            </TableRow>
        </TableLayout>

        <Button
            android:id="@+id/buttonPlus"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:onClick="onClickListener"
            android:text="@string/plus" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:orientation="vertical" >

            <Button
                android:id="@+id/buttonMinus"
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:onClick="onClickListener"
                android:text="@string/minus" />

            <Button
                android:id="@+id/buttonEval"
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:onClick="onClickListener"
                android:text="@string/eval" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

MainActivity类和之前的java计算器差不多:

 代码如下 复制代码

package me.jerrys.calc;

import java.math.BigDecimal;

import android.support.v7.app.ActionBarActivity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {
 private TextView textView;
 private BigDecimal lastNum = new BigDecimal("0");
 private BigDecimal currentNum = new BigDecimal("0");
 private String currentText;
 private boolean typeClean = false;
 private boolean hadCalced = false;
 private MODE currentMode = MODE.PLUS;
 private enum MODE {
  PLUS, MINUS, MULTIPLY, DIVIDE
 }
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  textView = (TextView) findViewById(R.id.resultText);
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

 public void onClickListener(View v) {
  currentText = textView.getText().toString();
  switch (v.getId()) {
  case R.id.button0:
   addNumber("0");
   break;
  case R.id.button1:
   addNumber("1");
   break;
  case R.id.button2:
   addNumber("2");
   break;
  case R.id.button3:
   addNumber("3");
   break;
  case R.id.button4:
   addNumber("4");
   break;
  case R.id.button5:
   addNumber("5");
   break;
  case R.id.button6:
   addNumber("6");
   break;
  case R.id.button7:
   addNumber("7");
   break;
  case R.id.button8:
   addNumber("8");
   break;
  case R.id.button9:
   addNumber("9");
   break;
  case R.id.buttonNegSign:
   addSign();
   break;
  case R.id.buttonClear:
   clear();
   break;
  case R.id.buttonBackSpace:
   backSpace();
   break;
  case R.id.buttonPlus:
   setMode(MODE.PLUS);
   break;
  case R.id.buttonMinus:
   setMode(MODE.MINUS);
   break;
  case R.id.buttonMultiply:
   setMode(MODE.MULTIPLY);
   break;
  case R.id.buttonDivide:
   setMode(MODE.DIVIDE);
   break;
  case R.id.buttonEval:
   calc();
   break;
  case R.id.buttonDot:
   addNumber(".");
   break;
  }
 }
 private void calc() {
  if (hadCalced && typeClean) return;
  currentNum = new BigDecimal(currentText);
  try {
   switch (currentMode) {
   case PLUS:
    lastNum = lastNum.add(currentNum);
    break;
   case MINUS:
    lastNum = lastNum.subtract(currentNum);
    break;
   case MULTIPLY:
    lastNum = lastNum.multiply(currentNum);
    break;
   case DIVIDE:
    lastNum = lastNum.divide(currentNum, 16,
      BigDecimal.ROUND_HALF_DOWN);
    break;
   }
  } catch (Exception e) {
   Toast.makeText(getApplicationContext(), "发生错误:"+e.getMessage(), Toast.LENGTH_SHORT).show();
   return;
  }
  String resultText = lastNum.toString();
  if (resultText.indexOf(".") > 0) { // 消除小数多余位数
   resultText = resultText.replaceAll("0+?$", "");
   resultText = resultText.replaceAll("[.]$", "");
  }
  setResultText(resultText);
  typeClean = true;
  hadCalced = false;
 }
 private void setMode(MODE mode) {
  if (!hadCalced && !typeClean) {
   calc();
   currentMode = mode;
   return;
  }
  lastNum = new BigDecimal(currentText);
  currentMode = mode;
  typeClean = true;
  hadCalced = true;
 }
 
 private void addSign() {
  if (currentText.equals("0") || currentText.equals("")) return;
  if (currentText.startsWith("-")) setResultText(currentText.substring(1));
  else setResultText("-" + currentText);
 }
 
 private void clear() {
  currentNum = new BigDecimal("0");
  lastNum = new BigDecimal("0");
  typeClean = false;
  currentMode = MODE.PLUS;
  setResultText("0");
 }
 
 private void setResultText(String string) {
  textView.setText(string);
 }

 public void addNumber(String num) {
  String resultText = currentText;
  if (typeClean == true) {
   resultText = "0";
   typeClean = false;
  }
  if (num.equals(".") && currentText.lastIndexOf(".") != -1) return;
  if ((resultText.equals("0") || resultText.equals(""))
    && !num.equals("."))
   resultText = "";
  resultText = resultText + num;
  setResultText(resultText);
 }
 
 private void backSpace() {
  if (currentText.equals("0") || currentText.equals("")) return;
  if (currentText.length() == 1) {
   setResultText("0");
   return;
  }
  setResultText(currentText.substring(0, currentText.length() - 1));
 }
 
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  if (item.getItemId() == R.id.action_about) {
   new AlertDialog.Builder(this).setTitle("关于").setMessage("【Android www.111cn.net简易计算器】n作者  JerryLocken博客  n源码  /android-simple-calc").setPositiveButton("确定", null).show();
   return true;
  }
  return super.onOptionsItemSelected(item);
 }
}


QQ截图20140423183332

下面来看一篇关于Android生成商品条形码的例子,这个生成是利用了EAN-13方式来生成了,代码与生成例子都在文章下面有大家可测试一下。

简介
商品条码,或者EAN是欧洲标准条码。该条码被作为商品和商品制造商的唯一标识,同时,是美国标准UPC的超集。EAN-13由前十二位数字和第十三位作为校验位的数字组成。其中第十三位数字由前十二位数字按照一定公式计算得出。
如今,各个领域都有条码的应用。如果你以写代码为生,你的程序需要支持条码是早晚的事儿。比如超市的会员打折系统,用户以手机获取的条码作为唯一标识,来获得折扣。又比如支付系统中的星巴克支付系统。本文中,我们将讨论如何在安卓系统中生成EAN-13条码。


EAN-13计算基础

EAN-13采用的是是各位商品码,第十三位作为校验位。该校验位有前十二位数字生成。生成校验位的算法如下(数据从左到右计数):
P1 = 偶数位的数字和
P2 = 奇数位的数字和
Z = P1 + 3 * P2
R = 取个位数作为Z值
校验位 = R - Z
下面我们看一下EAN-13的编码结构:
首位不参与计算
随后六位根据首位数字编码
末六位以下列规则转换
首位 左六位 右六位
0 LLLLLL RRRRRR
1 LLGLGG RRRRRR
2 LLGGLG RRRRRR
3 LLGGGL RRRRRR
4 LGLLGG RRRRRR
5 LGGLLG RRRRRR
6 LGGGLL RRRRRR
7 LGLGLG RRRRRR
8 LGLGGL RRRRRR
9 LGGLGL RRRRRR
位编码:
Digit L - code G - code R - code
0 0001101 0100111 1110010
1 0011001 0110011 1100110
2 0010011 0011011 1101100
3 0111101 0100001 1000010
4 0100011 0011101 1011100
5 0110001 0111001 1001110
6 0101111 0000101 1010000
7 0111011 0010001 1000100
8 0110111 0001001 1001000
9 0001011 0010111 1110100
应用
文章尾部,我贴出了一个用十二位数字生成EAN-13条码的类EAN13CodeBuilder。这个类可以把生成的十三位数字的每一位都替换为可以展示到屏幕的特殊字体。该字体包括了一些特殊字符,比如$,+,!和其如上所述的十个数字的编码L,R,G。在EAN-13条码必须以以下方式生成:起始界定符(取决于第一位数字)-左六位-中间分隔符-右六位-终止符(!)
Digit L - code G - code R -code Start delimiter
0 0 A a #!
1 1 B b $!
2 2 C c %!
3 3 D d &!
4 4 E e '!
5 5 F f (!
6 6 G g )!
7 7 H h *!
8 8 I i +!
9 9 J j ,!
我们需要做的,仅仅是用数字生成正确的字符串,并用特殊字体展示而已。
这个类的使用非常简单。它将原始字符串传递给构造函数,之后调用getcode()方法取回EAN-13条码。这个类的源代码如下:
 

 代码如下 复制代码
public class EAN13CodeBuilder {
    private String codeStringValue;
    private String generatedCode;
 
    public EAN13CodeBuilder(String codeString)
    {
        codeStringValue = codeString;
        parse();
    }
 
    public String getCode()
    {
        return generatedCode;
 
    }
 
    ////////////////////////////////////////////////////////////////
    // this method generates EAN 13 control number ans returns full 
    // string to encode
    private String getFullCode()
    {
        
       int chetVal = 0, nechetVal = 0;
       String codeToParse = codeStringValue;
 
       for( int index = 0;index<6;index++ )
       {
          chetVal += Integer.valueOf(codeToParse.substring(
                                     index*2+1,index*2+2)).intValue();
          nechetVal += Integer.valueOf(codeToParse.substring(
                                       index*2,index*2+1)).intValue();
       }
 
       chetVal *= 3;
       int controlNumber = 10 - (chetVal+nechetVal)%10;
       if( controlNumber == 10 ) controlNumber  = 0;
 
       codeToParse += String.valueOf(controlNumber);
 
       return codeToParse;
 
    }
 
    private String DigitToUpperCase( String digit)
    {
       String letters  = "ABCDEFGHIJ";
       int position = Integer.valueOf(digit).intValue();
 
       String retVal = letters.substring(position,position+1);
 
       return retVal;
 
    }
 
    private String DigitToLowerCase( String digit)
    {
       String letters  = "abcdefghij";
       int position = Integer.valueOf(digit).intValue();
 
       String retVal = letters.substring(position,position+1);
 
       return retVal;
 
    }
    //////////////////////////////////////////////
    // this method generates EAN 13 encoded string
    // algorithm can be found at http://en.wikipedia.org/wiki/EAN-13
    private String createEAN13Code(String rawCode)
    {
         int firstFlag = Integer.valueOf(
 
                rawCode.substring(0,1)
 
         ).intValue();
 
         String leftString = rawCode.substring(1,7);
         String rightString = rawCode.substring(7);
 
         String rightCode = "";
         String leftCode = "";
 
         for( int i=0;i<6;i++)
         {
           rightCode += DigitToLowerCase( rightString.substring(i,i+1) );
         }
 
 
 
         if( firstFlag == 0 )
         {
            leftCode = "#!"+leftString.substring(0,1)
                           +leftString.substring(1,2)
                           +leftString.substring(2,3)
                           +leftString.substring(3,4)
                           +leftString.substring(4,5)
                           +leftString.substring(5);
         }
         if( firstFlag == 1 )
         {
             
            leftCode = "$!"+leftString.substring(0,1)
                           +leftString.substring(1,2)
                           +DigitToUpperCase(leftString.substring(2,3))
                           +leftString.substring(3,4)
                           +DigitToUpperCase(leftString.substring(4,5))
                           +DigitToUpperCase(leftString.substring(5));
         }
         if( firstFlag == 2 )
         {
            leftCode = "%!"+leftString.substring(0,1)
                           +leftString.substring(1,2)
                           +DigitToUpperCase(leftString.substring(2,3))
                           +DigitToUpperCase(leftString.substring(3,4))
                           +leftString.substring(4,5)
                           +DigitToUpperCase(leftString.substring(5));
         }
         if( firstFlag == 3 )
         {
            leftCode = "&!"+leftString.substring(0,1)
                         +leftString.substring(1,2)
                         +DigitToUpperCase(leftString.substring(2,3))
                         +DigitToUpperCase(leftString.substring(3,4))
                         +DigitToUpperCase(leftString.substring(4,5))
                         +leftString.substring(5);
         }
         if( firstFlag == 4 )
         {
            leftCode = "'!"+leftString.substring(0,1)
                         +DigitToUpperCase(leftString.substring(1,2))
                         +leftString.substring(2,3)
                         +leftString.substring(3,4)
                         +DigitToUpperCase(leftString.substring(4,5))
                         +DigitToUpperCase(leftString.substring(5));
         }
         if( firstFlag == 5 )
         {
            leftCode = "(!"+leftString.substring(0,1)
                         +DigitToUpperCase(leftString.substring(1,2))
                         +DigitToUpperCase(leftString.substring(2,3))
                         +leftString.substring(3,4)
                         +leftString.substring(4,5)
                         +DigitToUpperCase(leftString.substring(5));
         }
         if( firstFlag == 6 )
         {
            leftCode = ")!"+leftString.substring(0,1)
                           +DigitToUpperCase(leftString.substring(1,2))
                           +DigitToUpperCase(leftString.substring(2,3))
                           +DigitToUpperCase(leftString.substring(3,4))
                           +leftString.substring(4,5)
                           +leftString.substring(5);
         }
         if( firstFlag == 7 )
         {
            leftCode = "*!"+leftString.substring(0,1)
                         +DigitToUpperCase(leftString.substring(1,2))
                         +leftString.substring(2,3)
                         +DigitToUpperCase(leftString.substring(3,4))
                         +leftString.substring(4,5)
                         +DigitToUpperCase(leftString.substring(5));
         }
         if( firstFlag == 8 )
         {
            leftCode = "+!"+leftString.substring(0,1)
                         +DigitToUpperCase(leftString.substring(1,2))
                         +leftString.substring(2,3)
                         +DigitToUpperCase(leftString.substring(3,4))
                         +DigitToUpperCase(leftString.substring(4,5))
                         +leftString.substring(5);
         }
         if( firstFlag == 9 )
         {
            leftCode = ",!"+leftString.substring(0,1)
                         +DigitToUpperCase(leftString.substring(1,2))
                         +DigitToUpperCase(leftString.substring(2,3))
                         +leftString.substring(3,4)
                         +DigitToUpperCase(leftString.substring(4,5))
                         +leftString.substring(5);
         }
 
 
 
         String retVal = leftCode + "-" + rightCode + "!";
 
         return retVal;
    }
 
    private void parse()
    {
       String fullString = getFullCode();
       System.out.println( "Full code: " + fullString );
 
       generatedCode = createEAN13Code(fullString);
 
       System.out.println( "Generated code: " + generatedCode );
 
    }
}

代码
为了生成一个在线条码,并将它展示到安卓屏幕上,你可能需要自己生成条码并用其中的特殊字符展示到屏幕上。为了在安卓系统的TextView  部件中设置字符集,你需要在工程文件的 /assets 下放置一个文件,加载Typeface 并且设置Typeface  到TextView 中:

 代码如下 复制代码

import android.app.Activity;
import android.os.Bundle;
 
import android.view.View;
import android.widget.TextView;
import android.graphics.Typeface;
 
public class AndroidEAN13Activity extends Activity {
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        // ToDo add your GUI initialization code here
 
        this.setContentView(R.layout.main);
        TextView t = (TextView)findViewById(R.id.barcode);
 
        // set barcode font for TextView.
        // ttf file must be placed is assets/fonts 
        Typeface font = Typeface.createFromAsset(this.getAssets(), 
                        "fonts/EanP72Tt Normal.Ttf");
        t.setTypeface(font);
 
        // generate barcode string      
        EAN13CodeBuilder bb = new EAN13CodeBuilder("124958761310");
        t.setText(bb.getCode());
    }
}

在使用Android 4.4新增特性\"View.SYSTEM_UI_FLAG_IMMERSIVE\"时,Eclipse报错:SYSTEM_UI_FLAG_IMMERSIVE cannot be resolved or is not a field,下面一起来看解决办法
解决方法:
首先需要保证SDK的API level >= 19,否则你需要通过Android SDK Manager下载大于等于19的开发版本。
版本没问题的话,然后打开菜单 => "Project" => "properties" => "Android" => "Project Build Target" => 勾选19以上的API。
Android 4.4全屏模式  沉浸模式报错:SYSTEM_UI_FLAG_IMMERSIVE cannot be resolved or is not a
下面给大家分享一篇关于利用ListView实现圆弧列表的方法,希望此教程对各位安卓开发者会带来帮助哦。
简介
制作一个垂直列表非常常见也很简单,如下所示:
Android使用ListView实现圆弧列表例子
但是我们如何创建一个可以圆弧型的列表呢?就像下面的效果:
Android使用ListView实现圆弧列表例子
如何实现?
当然,我们必须定制一个视图来创建一个那样的列表。我决定使用SurfaceView 来创建这个列表视图。经过分析之后,该问题包含如下内容:
  • 如何在圆弧内绘制图片?
  • 如何让列表按照圆弧的轨迹滑动?
如何在圆弧内绘制图片?
假设有一个带中心点的圆弧(centerX, centerY)和半径r。一个点P有相对于中心点的角度。那么下面的公式就可以描述出该问题:
  • P(x) =  centerX + cos(alpha) *r.
  • P(y) = centerY - sin(alpha) * r.
基于此,我们可以很方便的在圆弧上绘制一个列表项.
如何在圆弧上滑动列表视图?
当用户滑动列表时,会出现该问题。我们如何更新每个列表项的角度?确切的说,我们必须详细记录滑动的角度。之后添加到当前列表视图中每一项的角度中。为了解决这个要求。我决定使用GestureDetector 来控制这个事件。同时,在这个类中,我主要考虑的是如何详细记录滑动的角度(函数名如下).
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
基于e2, distanceX, 和 distanceY,滑动的角度将被详细记录到下面的图片中:
Android使用ListView实现圆弧列表例子
基于此图片,我们给出了下面的公式
Android使用ListView实现圆弧列表例子
=> scroll angle = β - α
代码

我讲创建一个展示的列表作为样例。列表中的图片来自于资源文件夹。你可以参考我上传的源代码.

 代码如下 复制代码

int[] playerDrawableResourceIds = new int[] { R.drawable.ronaldo,
            R.drawable.zindance, R.drawable.congvinh, R.drawable.huynhduc,
            R.drawable.gerrard, R.drawable.nagatomo, R.drawable.messi,
            R.drawable.minhphuong, R.drawable.neymar, R.drawable.ronaldo_beo,
            R.drawable.ronaldinho, R.drawable.xavi };


如何在圆弧中绘制图片?

首先,创建一个列表项的类CircleDrawItem.

 代码如下 复制代码
 
public class CircleDrawItem {
    public Bitmap mIconBitmap;
    public double mAngle;
}

    mIconBitmap: 列表项的位图.

    mAngle: 每个列表项的弧度。这个弧度在旋转列表项的时候会被更新.

因为该圆弧将被在屏幕左侧展示。所以圆心将会把X坐标设置为负数。同时,Y坐标将被设置为屏幕中心的Y坐标值.
 

 代码如下 复制代码
mCenterX = (int) (-Global.dp * 200);
mCenterY = (int) (Global.dh / 2.0f);
mRadius = (int) (450 * Global.dp);
mStartAngleInRadian = Math.PI / 4;


用Global 的值进行计算:

 代码如下 复制代码
 
Global.dw = getResources().getDisplayMetrics().widthPixels;
Global.dh = getResources().getDisplayMetrics().heightPixels;
Global.dp = Global.density / 1.5f;


这个圆弧保有CircleDrawItem的数组列表。第一项的弧度为PI/4。每个列表项的间隔是PI/10.第一项的弧度和两项间的弧度可以根据你的需求进行修改。

 

 代码如下 复制代码
for (int i = 0; i < playerDrawableResourceIds.length; i++) {
    CircleDrawItem circleDrawItem = new CircleDrawItem();
    circleDrawItem.mIconBitmap = decodeSampledBitmapFromResource(
            getResources(), playerDrawableResourceIds[i], 50, 50);
    circleDrawItem.mAngle = mStartAngleInRadian - i * Math.PI / 10;
    datas.add(circleDrawItem);     
}

我创建了一个线程,以便将每个数据项绘制到圆弧中。

 代码如下 复制代码
 
protected void draw() {
    Canvas canvas = getHolder().lockCanvas();
    if (canvas == null) {
        return;
    }
    canvas.save();
    canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setFilterBitmap(true);
    paint.setAntiAlias(true);
 
    for (int i = 0; i < datas.size(); i++) {
        canvas.save();
        CircleDrawItem item = datas.get(i);
        double x = mCenterX + Math.cos(item.mAngle) * mRadius;
        double y = mCenterY - Math.sin(item.mAngle) * mRadius;
        canvas.drawBitmap(item.mIconBitmap,
                (int) x - item.mIconBitmap.getWidth() / 2, (int) y
                        - item.mIconBitmap.getHeight() / 2, paint);
        canvas.restore();
    }
    canvas.restore();
    getHolder().unlockCanvasAndPost(canvas);
}

如何让列表在圆弧中滑动?

引用OnGestureListener 并重载onScroll()函数。

 代码如下 复制代码

 
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    float tpx = e2.getX();
    float tpy = e2.getY();
    float disx = (int) distanceX;
    float disy = (int) distanceY;
    double scrollAngle = calculateScrollAngle(tpx, tpy, tpx + disx, tpy
            + disy);
    for (int i = 0; i < datas.size(); i++) {
        datas.get(i).mAngle += scrollAngle;
    }
    return true;
}

计算滑动角度的方法如下:

 代码如下 复制代码

 
private double calculateScrollAngle(float px1, float py1, float px2,
        float py2) {
    double radian1 = Math.atan2(py1, px1);
    double radian2 = Math.atan2(py2, px2);
    double diff = radian2 - radian1;
    return diff;
}

最近在学习android应用开发了,但看到一段代码中有一句Handler.removeCallbacksAndMessages(null)当时搞不明白为什么时候会是移除空了,后来参考了一些资料才知识,下面一起来看看。

今天都到一段代码,在onDestroy()方法中,使用了下面的代码:


mHandler.removeCallbacksAndMessages(null);
 
一开始我完全看不懂,我为什么参数是null,如果是null还需要移除什么Callbacks和Messages。后来察看官方文档有以下说明:

地址:http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages%28java.lang.Object%29

 
public final void removeCallbacksAndMessages(Object token)

Added in API level 1
Remove any pending posts of callbacks and sent messages whose obj istoken. If token is null, all callbacks and messages will be removed.
 

上面的意思是说,如果参数为null的话,会将所有的Callbacks和Messages全部清除掉。
 

这样做的好处是在Acticity退出的时候,可以避免内存泄露。

[!--infotagslink--]

相关文章

  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • jQuery+jRange实现滑动选取数值范围特效

    有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • JS实现的简洁纵向滑动菜单(滑动门)效果

    本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • jQuery+slidereveal实现的面板滑动侧边展出效果

    我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • C#实现简易计算器功能(附源码)

    这篇文章主要为大家详细介绍了C#实现简易计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-21
  • PHP+jQuery翻板抽奖功能实现

    翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • SQLMAP结合Meterpreter实现注入渗透返回shell

    sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • PHP实现今天是星期几的几种写法

    复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15