当前位置:  编程技术>移动开发
本页文章导读:
    ▪radio button 旁边放图片以及挟制程序本地化以及string含有参数        radio button 旁边放图片以及强制程序本地化以及string含有参数 <RadioButton android:id="@+id/RadioButton01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Text"android:drawableLeft="@drawable.........
    ▪ M3G课程:进阶篇(六)动画        M3G教程:进阶篇(六)动画         M3G中动画的数据结构如下: 【载入World节点】       通过M3G Viewer查看M3G Converter转换的m3g文件,我们会发现m3g文件中camera并没有在world树下,而是和wor.........
    ▪ textView增添阴影       textView添加阴影 今天因为需要变态的要加入阴影 折磨了我好久 values/styles <style name="AudioFileInfoOverlayText">     <item name="android:paddingLeft">4px</item>     <item name="android:paddingBottom"&.........

[1]radio button 旁边放图片以及挟制程序本地化以及string含有参数
    来源: 互联网  发布时间: 2014-02-18
radio button 旁边放图片以及强制程序本地化以及string含有参数

<RadioButton android:id="@+id/RadioButton01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text"
android:drawableLeft="@drawable/icon"
android:drawableRight="@drawable/icon"
android:drawableTop="@drawable/icon"
android:drawableBottom="@drawable/icon" />

 

有时候为了使版本能够适用不同的地区 而选择了不同文件夹

其实有时候还可以强制使用

<activity android:name=".M1" android:configChanges="locale" android:label="@string/app_name" />
一定要加上啊

然后呢代码

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String languageToLoad = "cn";
    Locale locale = new Locale(languageToLoad);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,
    getBaseContext().getResources().getDisplayMetrics());
    this.setContentView(R.layout.main);
  }
剩下的就很简单了

你要做的就是 在main假设存在一个button,你想在上面设置文字 ,你想有英文的或者中文的,但是你想你手机使用的时候先强制使用中文

那么你只需要在

res中新建一个文件夹 values-cn 然后里面的参数和vvalues中的string一样就可以了 只要内容不同

然后你运行程序就会发现 原来先运行的是中文的

 

3.

 String msg = getResources().getString(R.string.text_c);       

  msg = java.text.MessageFormat.format(msg, "foo", "bar", locale);

 

 

 <string name="text_c">This string uses message formatting. In the current locale, {1} comes before {0} and the current locale is {2}.</string>


    
[2] M3G课程:进阶篇(六)动画
    来源: 互联网  发布时间: 2014-02-18
M3G教程:进阶篇(六)动画

 

      M3G中动画的数据结构如下:

【载入World节点】

      通过M3G Viewer查看M3G Converter转换的m3g文件,我们会发现m3g文件中camera并没有在world树下,而是和world树是平级的。因为JSR184要求渲染时所有模型信息必须放到world树下,所以我们要先获取World节点,方法有两种:

      ①遍历该Object3D数组,并比较每个元素的userid如果正是World节点的useid将该元素取出;
      ②遍历该Object3D数组,并比较每个元素是不是World类的实例,那么既然World节点是场景的根节点,那么在该Object3D数组中也应该只有一个World类的实例对象。

      第一种必需通过查看文件中world节点的userId来获取,第二种比较容易操作,代码如下:

/** Loads our world */
private void loadWorld() {
	try {
		// Loading the world is very simple. Note that I like to use a
		// res-folder that I keep all files in. If you normally just put
		// your
		// resources in the project root, then load it from the root.
		Object3D[] buffer = Loader.load("/axe.m3g");

		// Find the world node, best to do it the "safe" way
		for (int i = 0; i < buffer.length; i++) {
			if (buffer[i] instanceof World) {
				world = (World) buffer[i];
				break;
			}
		}

		// Clean objects
		buffer = null;
	} catch (Exception e) {
		// ERROR!
		System.out.println("Loading error!");
		reportException(e);
	}
}

      在JSR184中,使用AnimationTrack、AnimationController和KeyframeSquence三个类来实现关键帧动画:

  AnimationTrack:是一个集合类(Composition),用来将AnimationController、KeyframeSquence和一个特定属性(Target Property)捆绑起来,这种结构也使得同一个AnimationController和KeyframeSquence可以被不同的关键帧动画复用。在每一个Object3D对象中,通过addAnimationTrack和removeAnimationTrack方法,管理一组AnimationTrack序列;当使用animate方法,计算该Object3D对象关键帧动画时,所有在序列中的AnimationTrack都会被依次计算,此外若该Object3D对象有到其他Object3D的引用,则所有引用的Object3D的animate方法也会被依次执行。

  AnimationController:通过指定采样点和采样速度,实现从WorldTime到SquenceTime的映射,从而控制动画的播放效果,如:暂停,继续,快进、倒退等。

      AnimationController有一个激活时间段属性(通过setActiveInterval(int,int)实现),通过指定最小及最大的world time值来控制这个AnimationController在这个时间段是激活状态的。如果AnimationController是在某时间是非激活状态,则系统在动画计算时直接将其忽略。

      另外,AnimationController有一个weight属性,因为系统对对象某属性进行计算时会将与此属性相关的所有动画计算的结果进行合并,而weight则表示这个AnimationController在这个计算中所占的比重,确切的说,对于一个标量属性P的计算是这样的:P = sum [ wi Pi ] 。

      AnimationController将传入Object3D.animate()方法的world time值与sequence time值进行映射,sequence time主要用于对关键帧动画数据进行抽样。sequence time会在每次调用对象的animate()方法时计算得出,而不是store it internally,这是为了避免误差的累积及由此产生的一系列状况。这种设计简化了动画系统,使动画系统能够无状态化(相对于状态机),并且效率更高。

      从world time到sequence time的映射由AnimationController中的三个常量及传入animate()方法的world time进行计算得到的。公式如下:

     

      其中的参考值t[sref]及t[wref]是通过setPosition()方法指定,而速度speed则是由setSpeed()方法指定(注意改变速度会影响到t[sref]及t[wref]值)。

      注意:虽然API及文档中并没有明确的说明这里的时间单位使用毫秒,但我们强烈建议你使用这个默认的时间单位。当然,如果确实需要使用特有有时间单位,动画系统还是支持的。

  KeyframeSquence:用来保存所有的关键帧的值,同时指定关键帧循环的方式,以及计算时的插值方法。

      无论在立即模式还是保留模式下,都是通过调用Object3D对象的animate()方法实现将对象动画数据的计算。根据使用情形,我们既可以调用World.animate(),也可以调用相应Object3D对象的animate()方法。

【示例】

以下代码实现一个灯光在红色与绿色之间转换,并沿着一条曲线路径进行移动:

   初始化时:

Light light = new Light();	// Create a light node
 
// Load a motion path from a stream, assuming it's the first object there
 
Object3D[] objects = Loader.load("http://www.ex.com/ex.m3g");
KeyframeSequence motion = (KeyframeSequence) objects[0];
 
// Create a color keyframe sequence, with keyframes at 0 ms
// and 500 ms, and a total duration of 1000 ms. The animate
// method will throw an exception if it encounters a
// KeyframeSequence whose duration has not been set or whose
// keyframes are out of order. Note that the Loader
// automatically validates any sequences that are loaded from
// a file.
 
KeyframeSequence blinking = new KeyframeSequence(2, 3, KeyframeSequence.LINEAR);
blinking.setKeyframe(0,   0, new float[] { 1.0f, 0.0f, 0.0f });
blinking.setKeyframe(1, 500, new float[] { 0.0f, 1.0f, 0.0f });
blinking.setDuration(1000);
 
AnimationTrack blink = new AnimationTrack(blinking, AnimationTrack.COLOR);
AnimationTrack move = new AnimationTrack(motion, AnimationTrack.TRANSLATION);
light.addAnimationTrack(blink);
light.addAnimationTrack(move);
 
// Create an AnimationController and make it control both the
// blinking and the movement of our light
 
AnimationController lightAnim = new AnimationController();
blink.setController(lightAnim);
move.setController(lightAnim);
 
// Start the animation when world time reaches 2 seconds, stop
// at 5 s.  There is only one reference point for this
// animation: sequence time must be zero at world time 2000
// ms. The animation will be running at normal speed (1.0, the
// default).
 
lightAnim.setActiveInterval(2000, 5000);
lightAnim.setPosition(0, 2000);

    渲染时:

appTime += 30;		// advance time by 30 ms each frame
light.animate(appTime);
 
// Assume 'myGraphics3D' is the Graphics3D object we draw into.
// In immediate mode, node transforms are ignored, so we get
// our animated transformation into a local Transform object,
// "lightToWorld". As its name implies, the transformation is
// from the Light node's local coordinates to world space.
 
light.getTransform(lightToWorld);
myGraphics3D.resetLights();
myGraphics3D.addLight(light, lightToWorld);

 

【示例:播放袋鼠跳动动画】

package study.pogoroo;



import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.AnimationController;
import javax.microedition.m3g.AnimationTrack;
import javax.microedition.m3g.Camera;
import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.Group;
import javax.microedition.m3g.KeyframeSequence;
import javax.microedition.m3g.Loader;
import javax.microedition.m3g.Object3D;
import javax.microedition.m3g.World;


public class M3GCanvas extends GameCanvas implements Runnable {
	
	public static final int FPS = 50;	//每秒绘制的帧数
	
//	 Thread-control
	boolean running = false;

	boolean done = true;

	//UserIDs for objects we use in the scene.
    static final int POGOROO_TRANSFORM_ID = 347178853;
    static final int ROO_BOUNCE_ID = 418071423;

    // Control objects for game play
    // control for 'roo - group transform and cameras
    private AnimationController animRoo = null;
    private Group acRoo = null;
    private int animTime = 0;
    private int animLength = 0;
    private int animLastTime = 0;
    int viewport_x;
    int viewport_y;
    int viewport_width;
    int viewport_height;

	// Key array
	private boolean[] key = new boolean[5];

	// Key constants
	public static final int FIRE = 0;
	public static final int UP = 1;
	public static final int DOWN = 2;
	public static final int LEFT = 3;
	public static final int RIGHT = 4;

	// Camera rotation
	private float camRot = 0.0f;

	private Graphics3D g3d;
	private World world;
	private boolean runnable=true;
	private Thread thread;
	private Camera camera;

	protected M3GCanvas() {
		super(false);
		setFullScreenMode(true);
		g3d = Graphics3D.getInstance();
		
		//Load our world
		loadWorld();

		// Load our camera
		loadCamera();
		
		getObjects();
		
		setupAspectRatio();
	}
	
	/** Loads our camera */
	private void loadCamera() {
		// BAD!
		if (world == null)
			return;
		
		// Get the active camera from the world
		camera = world.getActiveCamera();
	}

	/** Loads our world */
	private void loadWorld() {
		try {
			// Loading the world is very simple. Note that I like to use a
			// res-folder that I keep all files in. If you normally just put
			// your
			// resources in the project root, then load it from the root.
			Object3D[] buffer = Loader.load("/pogoroo.m3g");
	
			// Find the world node, best to do it the "safe" way
			for (int i = 0; i < buffer.length; i++) {
				if (buffer[i] instanceof World) {
					world = (World) buffer[i];
					break;
				}
			}
	
			// Clean objects
			buffer = null;
		} catch (Exception e) {
			// ERROR!
			System.out.println("Loading error!");
		}
	}
	
	/**
     * Make sure that the content is rendered with the correct aspect ratio.
     */
    void setupAspectRatio() {
        viewport_x = 0;
        viewport_y = 0;
        viewport_width = getWidth();
        viewport_height = getHeight();

        float[] params = new float[4];
        int type = camera.getProjection(params);

        if (type != Camera.GENERIC) {
            //calculate window aspect ratio
            float waspect = viewport_width / viewport_height;

            if (waspect < params[1]) {
                float height = viewport_width / params[1];
                viewport_height = (int)height;
                viewport_y = (getHeight() - viewport_height) / 2;
            } else {
                float width = viewport_height * params[1];
                viewport_width = (int)width;
                viewport_x = (getWidth() - viewport_width) / 2;
            }
        }
    }
    
    /**
     * getObjects()
     * get objects from the scene tree for use in the game AI
     */
    public void getObjects() {
        try {
            acRoo = (Group)world.find(POGOROO_TRANSFORM_ID);
            animRoo = (AnimationController)world.find(ROO_BOUNCE_ID);

            // get length of animation
            AnimationTrack track = acRoo.getAnimationTrack(0);
            animLength = 1000; // default length, 1 second

            if (track != null) {
                KeyframeSequence ks = track.getKeyframeSequence();

                if (ks != null) {
                    animLength = ks.getDuration();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * animateRoo()
     * Makes sure that the hopping animation loops correctly.
     */
    private void animateRoo(int worldTime) {
        // control the kangaroo animation sequence
        if (animLastTime == 0) {
            animLastTime = worldTime;
        }

        animTime += (worldTime - animLastTime);

        // initialise animation at end of sequence
        if (animTime > animLength) // sequence is ~1000ms
         {
            animRoo.setActiveInterval(worldTime, worldTime+2000);
            //setPosition(float sequenceTime, int worldTime) 
            //Sets a new playback position, relative to world time, for this animation controller. 
            animRoo.setPosition(0, worldTime);
            animTime = 0;
        }

        // update storage of last position and time
        animLastTime = worldTime;
    }
	
	private void moveCamera() {
		// Check controls
		if (key[LEFT]) {
			camRot += 5.0f;
		} else if (key[RIGHT]) {
			camRot -= 5.0f;
		}

		// Set the orientation
		camera.setOrientation(camRot, 0.0f, 1.0f, 0.0f);

		// If the user presses the FIRE key, let's quit
		if (key[FIRE])
			System.out.println("Fire");
	}
	
	protected void process() {
		int keys = getKeyStates();

		if ((keys & GameCanvas.FIRE_PRESSED) != 0)
			key[FIRE] = true;
		else
			key[FIRE] = false;

		if ((keys & GameCanvas.UP_PRESSED) != 0)
			key[UP] = true;
		else
			key[UP] = false;

		if ((keys & GameCanvas.DOWN_PRESSED) != 0)
			key[DOWN] = true;
		else
			key[DOWN] = false;

		if ((keys & GameCanvas.LEFT_PRESSED) != 0)
			key[LEFT] = true;
		else
			key[LEFT] = false;

		if ((keys & GameCanvas.RIGHT_PRESSED) != 0)
			key[RIGHT] = true;
		else
			key[RIGHT] = false;
	}

	public void run() {
		Graphics g = getGraphics();
		while (runnable) {
			long startTime = System.currentTimeMillis();
			
			//Call the process method (computes keys)
			process();

			//Move the camera around
			moveCamera();
			
			try {
				//First bind the graphics object. We use our pre-defined rendering
				// hints.
				g3d.bindTarget(g);
				
				int st=(int)startTime;
	            // update the control and game AI
				animateRoo(st);
	            // Update the world to the current time.
	            world.animate(st);
	            
				g3d.setViewport(viewport_x, viewport_y, viewport_width, viewport_height);
				//Now, just render the world. Simple as pie!
				g3d.render(world);
			} finally {
				g3d.releaseTarget();
			}
			flushGraphics();
			
			long endTime = System.currentTimeMillis();
            long costTime = endTime - startTime;
            if(costTime<1000/FPS)
            {
                try{
                  Thread.sleep(1000/FPS-costTime);
                }
                catch(Exception e){
                   e.printStackTrace();
                }
            }
		}
		System.out.println("Canvas stopped");

	}
	
	public void start()
	{
		thread=new Thread(this);
		thread.start();
	}
	
	public void stop()
	{
		this.runnable=false;
		try {
			thread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

 

其中pogoroo.m3g的节点树关系如下:

效果如下:

 


    
[3] textView增添阴影
    来源: 互联网  发布时间: 2014-02-18
textView添加阴影

今天因为需要变态的要加入阴影 折磨了我好久

values/styles

<style name="AudioFileInfoOverlayText">
    <item name="android:paddingLeft">4px</item>
    <item name="android:paddingBottom">4px</item>
    <item name="android:textColor">#ffffffff</item>
    <item name="android:textSize">12sp</item>
    <item name="android:shadowColor">#ff00ff00</item>
    <item name="android:shadowDx">5</item>
    <item name="android:shadowDy">3</item>
    <item name="android:shadowRadius">6</item>

 

 <TextView android:id="@+id/info"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
      
       android:text="aaaa"
         android:gravity="center" />


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3